Add colored nicks settings option

This commit is contained in:
Ken-Håvard Lieng 2018-10-15 08:56:17 +02:00
parent ec03db4db6
commit 6c6a9e12cf
27 changed files with 577 additions and 109 deletions

View file

@ -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 {

View file

@ -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) {

View file

@ -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
View 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)
}

View file

@ -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))