Add colored nicks settings option
This commit is contained in:
parent
ec03db4db6
commit
6c6a9e12cf
27 changed files with 577 additions and 109 deletions
|
@ -1,7 +1,12 @@
|
|||
struct User {
|
||||
ID uint64
|
||||
Username string
|
||||
lastIP []byte
|
||||
ID uint64
|
||||
Username string
|
||||
clientSettings *ClientSettings
|
||||
lastIP []byte
|
||||
}
|
||||
|
||||
struct ClientSettings {
|
||||
ColoredNicks bool
|
||||
}
|
||||
|
||||
struct Server {
|
||||
|
|
|
@ -29,6 +29,15 @@ func (d *User) Size() (s uint64) {
|
|||
}
|
||||
s += l
|
||||
}
|
||||
{
|
||||
if d.clientSettings != nil {
|
||||
|
||||
{
|
||||
s += (*d.clientSettings).Size()
|
||||
}
|
||||
s += 0
|
||||
}
|
||||
}
|
||||
{
|
||||
l := uint64(len(d.lastIP))
|
||||
|
||||
|
@ -44,7 +53,7 @@ func (d *User) Size() (s uint64) {
|
|||
}
|
||||
s += l
|
||||
}
|
||||
s += 8
|
||||
s += 9
|
||||
return
|
||||
}
|
||||
func (d *User) Marshal(buf []byte) ([]byte, error) {
|
||||
|
@ -82,6 +91,22 @@ func (d *User) Marshal(buf []byte) ([]byte, error) {
|
|||
copy(buf[i+8:], d.Username)
|
||||
i += l
|
||||
}
|
||||
{
|
||||
if d.clientSettings == nil {
|
||||
buf[i+8] = 0
|
||||
} else {
|
||||
buf[i+8] = 1
|
||||
|
||||
{
|
||||
nbuf, err := (*d.clientSettings).Marshal(buf[i+9:])
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
i += uint64(len(nbuf))
|
||||
}
|
||||
i += 0
|
||||
}
|
||||
}
|
||||
{
|
||||
l := uint64(len(d.lastIP))
|
||||
|
||||
|
@ -90,18 +115,18 @@ func (d *User) Marshal(buf []byte) ([]byte, error) {
|
|||
t := uint64(l)
|
||||
|
||||
for t >= 0x80 {
|
||||
buf[i+8] = byte(t) | 0x80
|
||||
buf[i+9] = byte(t) | 0x80
|
||||
t >>= 7
|
||||
i++
|
||||
}
|
||||
buf[i+8] = byte(t)
|
||||
buf[i+9] = byte(t)
|
||||
i++
|
||||
|
||||
}
|
||||
copy(buf[i+8:], d.lastIP)
|
||||
copy(buf[i+9:], d.lastIP)
|
||||
i += l
|
||||
}
|
||||
return buf[:i+8], nil
|
||||
return buf[:i+9], nil
|
||||
}
|
||||
|
||||
func (d *User) Unmarshal(buf []byte) (uint64, error) {
|
||||
|
@ -132,16 +157,34 @@ func (d *User) Unmarshal(buf []byte) (uint64, error) {
|
|||
d.Username = string(buf[i+8 : i+8+l])
|
||||
i += l
|
||||
}
|
||||
{
|
||||
if buf[i+8] == 1 {
|
||||
if d.clientSettings == nil {
|
||||
d.clientSettings = new(ClientSettings)
|
||||
}
|
||||
|
||||
{
|
||||
ni, err := (*d.clientSettings).Unmarshal(buf[i+9:])
|
||||
if err != nil {
|
||||
return 0, err
|
||||
}
|
||||
i += ni
|
||||
}
|
||||
i += 0
|
||||
} else {
|
||||
d.clientSettings = nil
|
||||
}
|
||||
}
|
||||
{
|
||||
l := uint64(0)
|
||||
|
||||
{
|
||||
|
||||
bs := uint8(7)
|
||||
t := uint64(buf[i+8] & 0x7F)
|
||||
for buf[i+8]&0x80 == 0x80 {
|
||||
t := uint64(buf[i+9] & 0x7F)
|
||||
for buf[i+9]&0x80 == 0x80 {
|
||||
i++
|
||||
t |= uint64(buf[i+8]&0x7F) << bs
|
||||
t |= uint64(buf[i+9]&0x7F) << bs
|
||||
bs += 7
|
||||
}
|
||||
i++
|
||||
|
@ -154,10 +197,45 @@ func (d *User) Unmarshal(buf []byte) (uint64, error) {
|
|||
} else {
|
||||
d.lastIP = make([]byte, l)
|
||||
}
|
||||
copy(d.lastIP, buf[i+8:])
|
||||
copy(d.lastIP, buf[i+9:])
|
||||
i += l
|
||||
}
|
||||
return i + 8, nil
|
||||
return i + 9, nil
|
||||
}
|
||||
|
||||
func (d *ClientSettings) Size() (s uint64) {
|
||||
|
||||
s += 1
|
||||
return
|
||||
}
|
||||
func (d *ClientSettings) Marshal(buf []byte) ([]byte, error) {
|
||||
size := d.Size()
|
||||
{
|
||||
if uint64(cap(buf)) >= size {
|
||||
buf = buf[:size]
|
||||
} else {
|
||||
buf = make([]byte, size)
|
||||
}
|
||||
}
|
||||
i := uint64(0)
|
||||
|
||||
{
|
||||
if d.ColoredNicks {
|
||||
buf[0] = 1
|
||||
} else {
|
||||
buf[0] = 0
|
||||
}
|
||||
}
|
||||
return buf[:i+1], nil
|
||||
}
|
||||
|
||||
func (d *ClientSettings) Unmarshal(buf []byte) (uint64, error) {
|
||||
i := uint64(0)
|
||||
|
||||
{
|
||||
d.ColoredNicks = buf[0] == 1
|
||||
}
|
||||
return i + 1, nil
|
||||
}
|
||||
|
||||
func (d *Server) Size() (s uint64) {
|
||||
|
|
|
@ -12,16 +12,20 @@ type User struct {
|
|||
IDBytes []byte
|
||||
Username string
|
||||
|
||||
store Store
|
||||
messageLog MessageStore
|
||||
messageIndex MessageSearchProvider
|
||||
lastIP []byte
|
||||
certificate *tls.Certificate
|
||||
lock sync.Mutex
|
||||
store Store
|
||||
messageLog MessageStore
|
||||
messageIndex MessageSearchProvider
|
||||
clientSettings *ClientSettings
|
||||
lastIP []byte
|
||||
certificate *tls.Certificate
|
||||
lock sync.Mutex
|
||||
}
|
||||
|
||||
func NewUser(store Store) (*User, error) {
|
||||
user := &User{store: store}
|
||||
user := &User{
|
||||
store: store,
|
||||
clientSettings: DefaultClientSettings(),
|
||||
}
|
||||
|
||||
err := store.SaveUser(user)
|
||||
if err != nil {
|
||||
|
@ -84,6 +88,44 @@ func (u *User) SetLastIP(ip []byte) error {
|
|||
return u.store.SaveUser(u)
|
||||
}
|
||||
|
||||
//easyjson:json
|
||||
type ClientSettings struct {
|
||||
ColoredNicks bool
|
||||
}
|
||||
|
||||
func DefaultClientSettings() *ClientSettings {
|
||||
return &ClientSettings{
|
||||
ColoredNicks: true,
|
||||
}
|
||||
}
|
||||
|
||||
func (u *User) GetClientSettings() *ClientSettings {
|
||||
u.lock.Lock()
|
||||
settings := *u.clientSettings
|
||||
u.lock.Unlock()
|
||||
return &settings
|
||||
}
|
||||
|
||||
func (u *User) SetClientSettings(settings *ClientSettings) error {
|
||||
u.lock.Lock()
|
||||
u.clientSettings = settings
|
||||
u.lock.Unlock()
|
||||
|
||||
return u.store.SaveUser(u)
|
||||
}
|
||||
|
||||
func (u *User) UnmarshalClientSettingsJSON(b []byte) error {
|
||||
u.lock.Lock()
|
||||
err := u.clientSettings.UnmarshalJSON(b)
|
||||
u.lock.Unlock()
|
||||
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
return u.store.SaveUser(u)
|
||||
}
|
||||
|
||||
type Server struct {
|
||||
Name string
|
||||
Host string
|
||||
|
|
90
storage/user_easyjson.go
Normal file
90
storage/user_easyjson.go
Normal file
|
@ -0,0 +1,90 @@
|
|||
// Code generated by easyjson for marshaling/unmarshaling. DO NOT EDIT.
|
||||
|
||||
package storage
|
||||
|
||||
import (
|
||||
json "encoding/json"
|
||||
easyjson "github.com/mailru/easyjson"
|
||||
jlexer "github.com/mailru/easyjson/jlexer"
|
||||
jwriter "github.com/mailru/easyjson/jwriter"
|
||||
)
|
||||
|
||||
// suppress unused package warning
|
||||
var (
|
||||
_ *json.RawMessage
|
||||
_ *jlexer.Lexer
|
||||
_ *jwriter.Writer
|
||||
_ easyjson.Marshaler
|
||||
)
|
||||
|
||||
func easyjson9e1087fdDecodeGithubComKhliengDispatchStorage(in *jlexer.Lexer, out *ClientSettings) {
|
||||
isTopLevel := in.IsStart()
|
||||
if in.IsNull() {
|
||||
if isTopLevel {
|
||||
in.Consumed()
|
||||
}
|
||||
in.Skip()
|
||||
return
|
||||
}
|
||||
in.Delim('{')
|
||||
for !in.IsDelim('}') {
|
||||
key := in.UnsafeString()
|
||||
in.WantColon()
|
||||
if in.IsNull() {
|
||||
in.Skip()
|
||||
in.WantComma()
|
||||
continue
|
||||
}
|
||||
switch key {
|
||||
case "coloredNicks":
|
||||
out.ColoredNicks = bool(in.Bool())
|
||||
default:
|
||||
in.SkipRecursive()
|
||||
}
|
||||
in.WantComma()
|
||||
}
|
||||
in.Delim('}')
|
||||
if isTopLevel {
|
||||
in.Consumed()
|
||||
}
|
||||
}
|
||||
func easyjson9e1087fdEncodeGithubComKhliengDispatchStorage(out *jwriter.Writer, in ClientSettings) {
|
||||
out.RawByte('{')
|
||||
first := true
|
||||
_ = first
|
||||
if in.ColoredNicks {
|
||||
const prefix string = ",\"coloredNicks\":"
|
||||
if first {
|
||||
first = false
|
||||
out.RawString(prefix[1:])
|
||||
} else {
|
||||
out.RawString(prefix)
|
||||
}
|
||||
out.Bool(bool(in.ColoredNicks))
|
||||
}
|
||||
out.RawByte('}')
|
||||
}
|
||||
|
||||
// MarshalJSON supports json.Marshaler interface
|
||||
func (v ClientSettings) MarshalJSON() ([]byte, error) {
|
||||
w := jwriter.Writer{}
|
||||
easyjson9e1087fdEncodeGithubComKhliengDispatchStorage(&w, v)
|
||||
return w.Buffer.BuildBytes(), w.Error
|
||||
}
|
||||
|
||||
// MarshalEasyJSON supports easyjson.Marshaler interface
|
||||
func (v ClientSettings) MarshalEasyJSON(w *jwriter.Writer) {
|
||||
easyjson9e1087fdEncodeGithubComKhliengDispatchStorage(w, v)
|
||||
}
|
||||
|
||||
// UnmarshalJSON supports json.Unmarshaler interface
|
||||
func (v *ClientSettings) UnmarshalJSON(data []byte) error {
|
||||
r := jlexer.Lexer{Data: data}
|
||||
easyjson9e1087fdDecodeGithubComKhliengDispatchStorage(&r, v)
|
||||
return r.Error()
|
||||
}
|
||||
|
||||
// UnmarshalEasyJSON supports easyjson.Unmarshaler interface
|
||||
func (v *ClientSettings) UnmarshalEasyJSON(l *jlexer.Lexer) {
|
||||
easyjson9e1087fdDecodeGithubComKhliengDispatchStorage(l, v)
|
||||
}
|
|
@ -80,6 +80,16 @@ func TestUser(t *testing.T) {
|
|||
channels, err = user.GetChannels()
|
||||
assert.Len(t, channels, 0)
|
||||
|
||||
settings := user.GetClientSettings()
|
||||
assert.NotNil(t, settings)
|
||||
assert.Equal(t, storage.DefaultClientSettings(), settings)
|
||||
|
||||
settings.ColoredNicks = !settings.ColoredNicks
|
||||
err = user.SetClientSettings(settings)
|
||||
assert.Nil(t, err)
|
||||
assert.Equal(t, settings, user.GetClientSettings())
|
||||
assert.NotEqual(t, settings, storage.DefaultClientSettings())
|
||||
|
||||
user.Remove()
|
||||
_, err = os.Stat(storage.Path.User(user.Username))
|
||||
assert.True(t, os.IsNotExist(err))
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue