Send irc features to the client
This commit is contained in:
parent
9267c661dc
commit
613d9fca6e
File diff suppressed because one or more lines are too long
@ -79,6 +79,7 @@ export default createCommandMiddleware(COMMAND, {
|
|||||||
topic({ dispatch, getState, server, channel }, ...newTopic) {
|
topic({ dispatch, getState, server, channel }, ...newTopic) {
|
||||||
if (newTopic.length > 0) {
|
if (newTopic.length > 0) {
|
||||||
dispatch(setTopic(newTopic.join(' '), channel, server));
|
dispatch(setTopic(newTopic.join(' '), channel, server));
|
||||||
|
return;
|
||||||
} else if (channel) {
|
} else if (channel) {
|
||||||
const { topic } = getState().channels[server][channel];
|
const { topic } = getState().channels[server][channel];
|
||||||
if (topic) {
|
if (topic) {
|
||||||
|
@ -1,5 +1,6 @@
|
|||||||
import React, { PureComponent } from 'react';
|
import React, { PureComponent } from 'react';
|
||||||
import classnames from 'classnames';
|
import classnames from 'classnames';
|
||||||
|
import get from 'lodash/get';
|
||||||
import Button from 'components/ui/Button';
|
import Button from 'components/ui/Button';
|
||||||
import TabListItem from 'containers/TabListItem';
|
import TabListItem from 'containers/TabListItem';
|
||||||
|
|
||||||
@ -39,13 +40,22 @@ export default class TabList extends PureComponent {
|
|||||||
/>
|
/>
|
||||||
);
|
);
|
||||||
|
|
||||||
|
let chanLabel;
|
||||||
|
const chanLimit =
|
||||||
|
get(srv.features, ['CHANLIMIT', '#'], 0) || srv.features.MAXCHANNELS;
|
||||||
|
if (chanLimit > 0) {
|
||||||
|
chanLabel = `CHANNELS (${server.channels.length}/${chanLimit})`;
|
||||||
|
} else {
|
||||||
|
chanLabel = `CHANNELS (${server.channels.length})`;
|
||||||
|
}
|
||||||
|
|
||||||
tabs.push(
|
tabs.push(
|
||||||
<div
|
<div
|
||||||
key={`${address}-chans}`}
|
key={`${address}-chans}`}
|
||||||
className="tab-label"
|
className="tab-label"
|
||||||
onClick={() => openModal('channel', { server: address })}
|
onClick={() => openModal('channel', { server: address })}
|
||||||
>
|
>
|
||||||
<span>CHANNELS ({server.channels.length})</span>
|
<span>{chanLabel}</span>
|
||||||
<Button>+</Button>
|
<Button>+</Button>
|
||||||
</div>
|
</div>
|
||||||
);
|
);
|
||||||
|
@ -16,7 +16,8 @@ describe('server reducer', () => {
|
|||||||
status: {
|
status: {
|
||||||
connected: false,
|
connected: false,
|
||||||
error: null
|
error: null
|
||||||
}
|
},
|
||||||
|
features: {}
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
@ -30,7 +31,8 @@ describe('server reducer', () => {
|
|||||||
status: {
|
status: {
|
||||||
connected: false,
|
connected: false,
|
||||||
error: null
|
error: null
|
||||||
}
|
},
|
||||||
|
features: {}
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
@ -47,7 +49,8 @@ describe('server reducer', () => {
|
|||||||
status: {
|
status: {
|
||||||
connected: false,
|
connected: false,
|
||||||
error: null
|
error: null
|
||||||
}
|
},
|
||||||
|
features: {}
|
||||||
},
|
},
|
||||||
'127.0.0.2': {
|
'127.0.0.2': {
|
||||||
name: 'srv',
|
name: 'srv',
|
||||||
@ -56,7 +59,8 @@ describe('server reducer', () => {
|
|||||||
status: {
|
status: {
|
||||||
connected: false,
|
connected: false,
|
||||||
error: null
|
error: null
|
||||||
}
|
},
|
||||||
|
features: {}
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
@ -216,7 +220,8 @@ describe('server reducer', () => {
|
|||||||
editedNick: null,
|
editedNick: null,
|
||||||
status: {
|
status: {
|
||||||
connected: true
|
connected: true
|
||||||
}
|
},
|
||||||
|
features: {}
|
||||||
},
|
},
|
||||||
'127.0.0.2': {
|
'127.0.0.2': {
|
||||||
name: 'stuffz',
|
name: 'stuffz',
|
||||||
@ -224,7 +229,8 @@ describe('server reducer', () => {
|
|||||||
editedNick: null,
|
editedNick: null,
|
||||||
status: {
|
status: {
|
||||||
connected: false
|
connected: false
|
||||||
}
|
},
|
||||||
|
features: {}
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
@ -247,7 +253,8 @@ describe('server reducer', () => {
|
|||||||
editedNick: null,
|
editedNick: null,
|
||||||
status: {
|
status: {
|
||||||
connected: true
|
connected: true
|
||||||
}
|
},
|
||||||
|
features: {}
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
@ -266,7 +273,8 @@ describe('server reducer', () => {
|
|||||||
status: {
|
status: {
|
||||||
connected: false,
|
connected: false,
|
||||||
error: 'Bad stuff happened'
|
error: 'Bad stuff happened'
|
||||||
}
|
},
|
||||||
|
features: {}
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
@ -70,6 +70,7 @@ export const socket = createSocketActions([
|
|||||||
'channel_search',
|
'channel_search',
|
||||||
'connection_update',
|
'connection_update',
|
||||||
'error',
|
'error',
|
||||||
|
'features',
|
||||||
'join',
|
'join',
|
||||||
'message',
|
'message',
|
||||||
'mode',
|
'mode',
|
||||||
|
@ -45,7 +45,8 @@ export default createReducer(
|
|||||||
status: {
|
status: {
|
||||||
connected: false,
|
connected: false,
|
||||||
error: null
|
error: null
|
||||||
}
|
},
|
||||||
|
features: {}
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@ -79,8 +80,8 @@ export default createReducer(
|
|||||||
|
|
||||||
[actions.socket.SERVERS](state, { data }) {
|
[actions.socket.SERVERS](state, { data }) {
|
||||||
if (data) {
|
if (data) {
|
||||||
data.forEach(({ host, name, nick, status }) => {
|
data.forEach(({ host, name = host, nick, status, features = {} }) => {
|
||||||
state[host] = { name, nick, status, editedNick: null };
|
state[host] = { name, nick, status, features, editedNick: null };
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@ -90,6 +91,17 @@ export default createReducer(
|
|||||||
state[server].status.connected = connected;
|
state[server].status.connected = connected;
|
||||||
state[server].status.error = error;
|
state[server].status.error = error;
|
||||||
}
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
[actions.socket.FEATURES](state, { server, features }) {
|
||||||
|
const srv = state[server];
|
||||||
|
if (srv) {
|
||||||
|
srv.features = features;
|
||||||
|
|
||||||
|
if (features.NETWORK && srv.name === server) {
|
||||||
|
srv.name = features.NETWORK;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
);
|
);
|
||||||
|
@ -14,7 +14,7 @@ const (
|
|||||||
)
|
)
|
||||||
|
|
||||||
func (c *Client) Casefold(s string) string {
|
func (c *Client) Casefold(s string) string {
|
||||||
mapping := c.Support.Get("CASEMAPPING")
|
mapping := c.Features.String("CASEMAPPING")
|
||||||
if mapping == "" {
|
if mapping == "" {
|
||||||
mapping = RFC1459
|
mapping = RFC1459
|
||||||
}
|
}
|
||||||
@ -22,7 +22,7 @@ func (c *Client) Casefold(s string) string {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (c *Client) EqualFold(s1, s2 string) bool {
|
func (c *Client) EqualFold(s1, s2 string) bool {
|
||||||
mapping := c.Support.Get("CASEMAPPING")
|
mapping := c.Features.String("CASEMAPPING")
|
||||||
if mapping == "" {
|
if mapping == "" {
|
||||||
mapping = RFC1459
|
mapping = RFC1459
|
||||||
}
|
}
|
||||||
|
@ -11,20 +11,20 @@ import (
|
|||||||
)
|
)
|
||||||
|
|
||||||
type Client struct {
|
type Client struct {
|
||||||
Server string
|
Server string
|
||||||
Host string
|
Host string
|
||||||
TLS bool
|
TLS bool
|
||||||
TLSConfig *tls.Config
|
TLSConfig *tls.Config
|
||||||
Password string
|
Password string
|
||||||
Username string
|
Username string
|
||||||
Realname string
|
Realname string
|
||||||
|
HandleNickInUse func(string) string
|
||||||
|
|
||||||
Messages chan *Message
|
Messages chan *Message
|
||||||
ConnectionChanged chan ConnectionState
|
ConnectionChanged chan ConnectionState
|
||||||
HandleNickInUse func(string) string
|
Features *Features
|
||||||
|
nick string
|
||||||
nick string
|
channels []string
|
||||||
channels []string
|
|
||||||
Support *iSupport
|
|
||||||
|
|
||||||
conn net.Conn
|
conn net.Conn
|
||||||
connected bool
|
connected bool
|
||||||
@ -44,7 +44,7 @@ type Client struct {
|
|||||||
func NewClient(nick, username string) *Client {
|
func NewClient(nick, username string) *Client {
|
||||||
return &Client{
|
return &Client{
|
||||||
nick: nick,
|
nick: nick,
|
||||||
Support: newISupport(),
|
Features: NewFeatures(),
|
||||||
Username: username,
|
Username: username,
|
||||||
Realname: nick,
|
Realname: nick,
|
||||||
Messages: make(chan *Message, 32),
|
Messages: make(chan *Message, 32),
|
||||||
|
@ -232,7 +232,7 @@ func (c *Client) recv() {
|
|||||||
go c.send()
|
go c.send()
|
||||||
|
|
||||||
case ReplyISupport:
|
case ReplyISupport:
|
||||||
c.Support.parse(msg.Params)
|
c.Features.Parse(msg.Params)
|
||||||
|
|
||||||
case ErrNicknameInUse:
|
case ErrNicknameInUse:
|
||||||
if c.HandleNickInUse != nil {
|
if c.HandleNickInUse != nil {
|
||||||
|
134
pkg/irc/feature.go
Normal file
134
pkg/irc/feature.go
Normal file
@ -0,0 +1,134 @@
|
|||||||
|
package irc
|
||||||
|
|
||||||
|
import (
|
||||||
|
"strconv"
|
||||||
|
"strings"
|
||||||
|
"sync"
|
||||||
|
)
|
||||||
|
|
||||||
|
type Features struct {
|
||||||
|
m map[string]interface{}
|
||||||
|
lock sync.Mutex
|
||||||
|
}
|
||||||
|
|
||||||
|
func NewFeatures() *Features {
|
||||||
|
return &Features{
|
||||||
|
m: map[string]interface{}{},
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (f *Features) Map() map[string]interface{} {
|
||||||
|
m := map[string]interface{}{}
|
||||||
|
f.lock.Lock()
|
||||||
|
for k, v := range f.m {
|
||||||
|
m[k] = v
|
||||||
|
}
|
||||||
|
f.lock.Unlock()
|
||||||
|
return m
|
||||||
|
}
|
||||||
|
|
||||||
|
func (f *Features) Parse(params []string) {
|
||||||
|
f.lock.Lock()
|
||||||
|
for _, param := range params[1 : len(params)-1] {
|
||||||
|
key, val := splitParam(param)
|
||||||
|
if key == "" {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
|
||||||
|
if key[0] == '-' {
|
||||||
|
delete(f.m, key[1:])
|
||||||
|
} else {
|
||||||
|
if t, ok := featureTransforms[key]; ok {
|
||||||
|
f.m[key] = t(val)
|
||||||
|
} else {
|
||||||
|
f.m[key] = val
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
f.lock.Unlock()
|
||||||
|
}
|
||||||
|
|
||||||
|
func (f *Features) Has(key string) bool {
|
||||||
|
f.lock.Lock()
|
||||||
|
_, has := f.m[key]
|
||||||
|
f.lock.Unlock()
|
||||||
|
return has
|
||||||
|
}
|
||||||
|
|
||||||
|
func (f *Features) Get(key string) interface{} {
|
||||||
|
f.lock.Lock()
|
||||||
|
v := f.m[key]
|
||||||
|
f.lock.Unlock()
|
||||||
|
return v
|
||||||
|
}
|
||||||
|
|
||||||
|
func (f *Features) String(key string) string {
|
||||||
|
if v, ok := f.Get(key).(string); ok {
|
||||||
|
return v
|
||||||
|
}
|
||||||
|
return ""
|
||||||
|
}
|
||||||
|
|
||||||
|
func (f *Features) Int(key string) int {
|
||||||
|
if v, ok := f.Get(key).(int); ok {
|
||||||
|
return v
|
||||||
|
}
|
||||||
|
return 0
|
||||||
|
}
|
||||||
|
|
||||||
|
type featureTransform func(interface{}) interface{}
|
||||||
|
|
||||||
|
func toInt(v interface{}) interface{} {
|
||||||
|
s := v.(string)
|
||||||
|
if s == "" {
|
||||||
|
return 0
|
||||||
|
}
|
||||||
|
|
||||||
|
i, _ := strconv.Atoi(s)
|
||||||
|
return i
|
||||||
|
}
|
||||||
|
|
||||||
|
func toCharList(v interface{}) interface{} {
|
||||||
|
s := v.(string)
|
||||||
|
list := make([]string, len(s))
|
||||||
|
for i := range s {
|
||||||
|
list[i] = s[i : i+1]
|
||||||
|
}
|
||||||
|
return list
|
||||||
|
}
|
||||||
|
|
||||||
|
func parseChanlimit(v interface{}) interface{} {
|
||||||
|
limits := map[string]int{}
|
||||||
|
|
||||||
|
pairs := strings.Split(v.(string), ",")
|
||||||
|
for _, p := range pairs {
|
||||||
|
pair := strings.Split(p, ":")
|
||||||
|
|
||||||
|
if len(pair) == 2 {
|
||||||
|
prefixes := pair[0]
|
||||||
|
limit, _ := strconv.Atoi(pair[1])
|
||||||
|
|
||||||
|
for i := range prefixes {
|
||||||
|
limits[prefixes[i:i+1]] = limit
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return limits
|
||||||
|
}
|
||||||
|
|
||||||
|
var featureTransforms = map[string]featureTransform{
|
||||||
|
"AWAYLEN": toInt,
|
||||||
|
"CHANLIMIT": parseChanlimit,
|
||||||
|
"CHANNELLEN": toInt,
|
||||||
|
"CHANTYPES": toCharList,
|
||||||
|
"HOSTLEN": toInt,
|
||||||
|
"KICKLEN": toInt,
|
||||||
|
"MAXCHANNELS": toInt,
|
||||||
|
"MAXTARGETS": toInt,
|
||||||
|
"MODES": toInt,
|
||||||
|
"NICKLEN": toInt,
|
||||||
|
"TOPICLEN": toInt,
|
||||||
|
"USERLEN": toInt,
|
||||||
|
}
|
49
pkg/irc/feature_test.go
Normal file
49
pkg/irc/feature_test.go
Normal file
@ -0,0 +1,49 @@
|
|||||||
|
package irc
|
||||||
|
|
||||||
|
import (
|
||||||
|
"testing"
|
||||||
|
|
||||||
|
"github.com/stretchr/testify/assert"
|
||||||
|
)
|
||||||
|
|
||||||
|
func TestParseFeatures(t *testing.T) {
|
||||||
|
s := NewFeatures()
|
||||||
|
featureTransforms["CAKE"] = toInt
|
||||||
|
s.Parse([]string{"bob", "CAKE=31", "PIE", ":durr"})
|
||||||
|
assert.Equal(t, 31, s.Int("CAKE"))
|
||||||
|
assert.Equal(t, "", s.String("CAKE"))
|
||||||
|
assert.True(t, s.Has("CAKE"))
|
||||||
|
assert.True(t, s.Has("PIE"))
|
||||||
|
assert.False(t, s.Has("APPLES"))
|
||||||
|
assert.Equal(t, "", s.String("APPLES"))
|
||||||
|
assert.Equal(t, 0, s.Int("APPLES"))
|
||||||
|
|
||||||
|
s.Parse([]string{"bob", "-PIE", ":hurr"})
|
||||||
|
assert.False(t, s.Has("PIE"))
|
||||||
|
|
||||||
|
s.Parse([]string{"bob", "CAKE=1337", ":durr"})
|
||||||
|
assert.Equal(t, 1337, s.Int("CAKE"))
|
||||||
|
|
||||||
|
s.Parse([]string{"bob", "CAKE=", ":durr"})
|
||||||
|
assert.Equal(t, "", s.String("CAKE"))
|
||||||
|
assert.True(t, s.Has("CAKE"))
|
||||||
|
|
||||||
|
delete(featureTransforms, "CAKE")
|
||||||
|
s.Parse([]string{"bob", "CAKE===", ":durr"})
|
||||||
|
assert.Equal(t, "==", s.String("CAKE"))
|
||||||
|
|
||||||
|
s.Parse([]string{"bob", "-CAKE=31", ":durr"})
|
||||||
|
assert.False(t, s.Has("CAKE"))
|
||||||
|
|
||||||
|
s.Parse([]string{"bob", "CHANLIMIT=#&:50", ":durr"})
|
||||||
|
assert.Equal(t, map[string]int{"#": 50, "&": 50}, s.Get("CHANLIMIT"))
|
||||||
|
|
||||||
|
s.Parse([]string{"bob", "CHANLIMIT=#:50,&:25", ":durr"})
|
||||||
|
assert.Equal(t, map[string]int{"#": 50, "&": 25}, s.Get("CHANLIMIT"))
|
||||||
|
|
||||||
|
s.Parse([]string{"bob", "CHANLIMIT=&:50,#:", ":durr"})
|
||||||
|
assert.Equal(t, map[string]int{"#": 0, "&": 50}, s.Get("CHANLIMIT"))
|
||||||
|
|
||||||
|
s.Parse([]string{"bob", "CHANTYPES=#&", ":durr"})
|
||||||
|
assert.Equal(t, []string{"#", "&"}, s.Get("CHANTYPES"))
|
||||||
|
}
|
@ -2,9 +2,6 @@ package irc
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"strings"
|
"strings"
|
||||||
"sync"
|
|
||||||
|
|
||||||
"github.com/spf13/cast"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
type Message struct {
|
type Message struct {
|
||||||
@ -96,55 +93,6 @@ func ParseMessage(line string) *Message {
|
|||||||
return &msg
|
return &msg
|
||||||
}
|
}
|
||||||
|
|
||||||
type iSupport struct {
|
|
||||||
support map[string]string
|
|
||||||
lock sync.Mutex
|
|
||||||
}
|
|
||||||
|
|
||||||
func newISupport() *iSupport {
|
|
||||||
return &iSupport{
|
|
||||||
support: map[string]string{},
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func (i *iSupport) parse(params []string) {
|
|
||||||
i.lock.Lock()
|
|
||||||
for _, param := range params[1 : len(params)-1] {
|
|
||||||
key, val := splitParam(param)
|
|
||||||
if key == "" {
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
|
|
||||||
if key[0] == '-' {
|
|
||||||
delete(i.support, key[1:])
|
|
||||||
} else {
|
|
||||||
i.support[key] = val
|
|
||||||
}
|
|
||||||
}
|
|
||||||
i.lock.Unlock()
|
|
||||||
}
|
|
||||||
|
|
||||||
func (i *iSupport) Has(key string) bool {
|
|
||||||
i.lock.Lock()
|
|
||||||
_, has := i.support[key]
|
|
||||||
i.lock.Unlock()
|
|
||||||
return has
|
|
||||||
}
|
|
||||||
|
|
||||||
func (i *iSupport) Get(key string) string {
|
|
||||||
i.lock.Lock()
|
|
||||||
v := i.support[key]
|
|
||||||
i.lock.Unlock()
|
|
||||||
return v
|
|
||||||
}
|
|
||||||
|
|
||||||
func (i *iSupport) GetInt(key string) int {
|
|
||||||
i.lock.Lock()
|
|
||||||
v := i.support[key]
|
|
||||||
i.lock.Unlock()
|
|
||||||
return cast.ToInt(v)
|
|
||||||
}
|
|
||||||
|
|
||||||
func splitParam(param string) (string, string) {
|
func splitParam(param string) (string, string) {
|
||||||
parts := strings.SplitN(param, "=", 2)
|
parts := strings.SplitN(param, "=", 2)
|
||||||
if len(parts) == 2 {
|
if len(parts) == 2 {
|
||||||
|
@ -187,31 +187,3 @@ func TestBadMessage(t *testing.T) {
|
|||||||
assert.Nil(t, ParseMessage(":"))
|
assert.Nil(t, ParseMessage(":"))
|
||||||
assert.Nil(t, ParseMessage(""))
|
assert.Nil(t, ParseMessage(""))
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestParseISupport(t *testing.T) {
|
|
||||||
s := newISupport()
|
|
||||||
s.parse([]string{"bob", "CAKE=31", "PIE", ":durr"})
|
|
||||||
assert.Equal(t, 31, s.GetInt("CAKE"))
|
|
||||||
assert.Equal(t, "31", s.Get("CAKE"))
|
|
||||||
assert.True(t, s.Has("CAKE"))
|
|
||||||
assert.True(t, s.Has("PIE"))
|
|
||||||
assert.False(t, s.Has("APPLES"))
|
|
||||||
assert.Equal(t, "", s.Get("APPLES"))
|
|
||||||
assert.Equal(t, 0, s.GetInt("APPLES"))
|
|
||||||
|
|
||||||
s.parse([]string{"bob", "-PIE", ":hurr"})
|
|
||||||
assert.False(t, s.Has("PIE"))
|
|
||||||
|
|
||||||
s.parse([]string{"bob", "CAKE=1337", ":durr"})
|
|
||||||
assert.Equal(t, 1337, s.GetInt("CAKE"))
|
|
||||||
|
|
||||||
s.parse([]string{"bob", "CAKE=", ":durr"})
|
|
||||||
assert.Equal(t, "", s.Get("CAKE"))
|
|
||||||
assert.True(t, s.Has("CAKE"))
|
|
||||||
|
|
||||||
s.parse([]string{"bob", "CAKE===", ":durr"})
|
|
||||||
assert.Equal(t, "==", s.Get("CAKE"))
|
|
||||||
|
|
||||||
s.parse([]string{"bob", "-CAKE=31", ":durr"})
|
|
||||||
assert.False(t, s.Has("CAKE"))
|
|
||||||
}
|
|
||||||
|
@ -77,10 +77,16 @@ func (d *Dispatch) getIndexData(r *http.Request, path string, state *State) *ind
|
|||||||
server.Username = ""
|
server.Username = ""
|
||||||
server.Realname = ""
|
server.Realname = ""
|
||||||
|
|
||||||
data.Servers = append(data.Servers, Server{
|
s := Server{
|
||||||
Server: server,
|
Server: server,
|
||||||
Status: newConnectionUpdate(server.Host, connections[server.Host]),
|
Status: newConnectionUpdate(server.Host, connections[server.Host]),
|
||||||
})
|
}
|
||||||
|
|
||||||
|
if i, ok := state.irc[server.Host]; ok {
|
||||||
|
s.Features = i.Features.Map()
|
||||||
|
}
|
||||||
|
|
||||||
|
data.Servers = append(data.Servers, s)
|
||||||
}
|
}
|
||||||
|
|
||||||
channels, err := state.user.GetChannels()
|
channels, err := state.user.GetChannels()
|
||||||
|
@ -216,6 +216,22 @@ func (i *ircHandler) info(msg *irc.Message) {
|
|||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (i *ircHandler) features(msg *irc.Message) {
|
||||||
|
i.state.sendJSON("features", Features{
|
||||||
|
Server: i.client.Host,
|
||||||
|
Features: i.client.Features.Map(),
|
||||||
|
})
|
||||||
|
|
||||||
|
if name := i.client.Features.String("NETWORK"); name != "" {
|
||||||
|
go func() {
|
||||||
|
server, err := i.state.user.GetServer(i.client.Host)
|
||||||
|
if err == nil && server.Name == "" {
|
||||||
|
i.state.user.SetServerName(name, server.Host)
|
||||||
|
}
|
||||||
|
}()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
func (i *ircHandler) whoisUser(msg *irc.Message) {
|
func (i *ircHandler) whoisUser(msg *irc.Message) {
|
||||||
i.whois.Nick = msg.Params[1]
|
i.whois.Nick = msg.Params[1]
|
||||||
i.whois.Username = msg.Params[2]
|
i.whois.Username = msg.Params[2]
|
||||||
@ -369,6 +385,7 @@ func (i *ircHandler) initHandlers() {
|
|||||||
irc.ReplyWelcome: i.info,
|
irc.ReplyWelcome: i.info,
|
||||||
irc.ReplyYourHost: i.info,
|
irc.ReplyYourHost: i.info,
|
||||||
irc.ReplyCreated: i.info,
|
irc.ReplyCreated: i.info,
|
||||||
|
irc.ReplyISupport: i.features,
|
||||||
irc.ReplyLUserClient: i.info,
|
irc.ReplyLUserClient: i.info,
|
||||||
irc.ReplyLUserOp: i.info,
|
irc.ReplyLUserOp: i.info,
|
||||||
irc.ReplyLUserUnknown: i.info,
|
irc.ReplyLUserUnknown: i.info,
|
||||||
|
@ -21,7 +21,13 @@ type WSResponse struct {
|
|||||||
|
|
||||||
type Server struct {
|
type Server struct {
|
||||||
*storage.Server
|
*storage.Server
|
||||||
Status ConnectionUpdate
|
Status ConnectionUpdate
|
||||||
|
Features map[string]interface{}
|
||||||
|
}
|
||||||
|
|
||||||
|
type Features struct {
|
||||||
|
Server string
|
||||||
|
Features map[string]interface{}
|
||||||
}
|
}
|
||||||
|
|
||||||
type ServerName struct {
|
type ServerName struct {
|
||||||
|
@ -781,6 +781,32 @@ func easyjson42239ddeDecodeGithubComKhliengDispatchServer7(in *jlexer.Lexer, out
|
|||||||
if data := in.Raw(); in.Ok() {
|
if data := in.Raw(); in.Ok() {
|
||||||
in.AddError((out.Status).UnmarshalJSON(data))
|
in.AddError((out.Status).UnmarshalJSON(data))
|
||||||
}
|
}
|
||||||
|
case "features":
|
||||||
|
if in.IsNull() {
|
||||||
|
in.Skip()
|
||||||
|
} else {
|
||||||
|
in.Delim('{')
|
||||||
|
if !in.IsDelim('}') {
|
||||||
|
out.Features = make(map[string]interface{})
|
||||||
|
} else {
|
||||||
|
out.Features = nil
|
||||||
|
}
|
||||||
|
for !in.IsDelim('}') {
|
||||||
|
key := string(in.String())
|
||||||
|
in.WantColon()
|
||||||
|
var v7 interface{}
|
||||||
|
if m, ok := v7.(easyjson.Unmarshaler); ok {
|
||||||
|
m.UnmarshalEasyJSON(in)
|
||||||
|
} else if m, ok := v7.(json.Unmarshaler); ok {
|
||||||
|
_ = m.UnmarshalJSON(in.Raw())
|
||||||
|
} else {
|
||||||
|
v7 = in.Interface()
|
||||||
|
}
|
||||||
|
(out.Features)[key] = v7
|
||||||
|
in.WantComma()
|
||||||
|
}
|
||||||
|
in.Delim('}')
|
||||||
|
}
|
||||||
case "name":
|
case "name":
|
||||||
out.Name = string(in.String())
|
out.Name = string(in.String())
|
||||||
case "host":
|
case "host":
|
||||||
@ -821,6 +847,36 @@ func easyjson42239ddeEncodeGithubComKhliengDispatchServer7(out *jwriter.Writer,
|
|||||||
}
|
}
|
||||||
out.Raw((in.Status).MarshalJSON())
|
out.Raw((in.Status).MarshalJSON())
|
||||||
}
|
}
|
||||||
|
if len(in.Features) != 0 {
|
||||||
|
const prefix string = ",\"features\":"
|
||||||
|
if first {
|
||||||
|
first = false
|
||||||
|
out.RawString(prefix[1:])
|
||||||
|
} else {
|
||||||
|
out.RawString(prefix)
|
||||||
|
}
|
||||||
|
{
|
||||||
|
out.RawByte('{')
|
||||||
|
v8First := true
|
||||||
|
for v8Name, v8Value := range in.Features {
|
||||||
|
if v8First {
|
||||||
|
v8First = false
|
||||||
|
} else {
|
||||||
|
out.RawByte(',')
|
||||||
|
}
|
||||||
|
out.String(string(v8Name))
|
||||||
|
out.RawByte(':')
|
||||||
|
if m, ok := v8Value.(easyjson.Marshaler); ok {
|
||||||
|
m.MarshalEasyJSON(out)
|
||||||
|
} else if m, ok := v8Value.(json.Marshaler); ok {
|
||||||
|
out.Raw(m.MarshalJSON())
|
||||||
|
} else {
|
||||||
|
out.Raw(json.Marshal(v8Value))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
out.RawByte('}')
|
||||||
|
}
|
||||||
|
}
|
||||||
if in.Name != "" {
|
if in.Name != "" {
|
||||||
const prefix string = ",\"name\":"
|
const prefix string = ",\"name\":"
|
||||||
if first {
|
if first {
|
||||||
@ -966,9 +1022,9 @@ func easyjson42239ddeDecodeGithubComKhliengDispatchServer8(in *jlexer.Lexer, out
|
|||||||
out.Results = (out.Results)[:0]
|
out.Results = (out.Results)[:0]
|
||||||
}
|
}
|
||||||
for !in.IsDelim(']') {
|
for !in.IsDelim(']') {
|
||||||
var v7 storage.Message
|
var v9 storage.Message
|
||||||
easyjson42239ddeDecodeGithubComKhliengDispatchStorage(in, &v7)
|
easyjson42239ddeDecodeGithubComKhliengDispatchStorage(in, &v9)
|
||||||
out.Results = append(out.Results, v7)
|
out.Results = append(out.Results, v9)
|
||||||
in.WantComma()
|
in.WantComma()
|
||||||
}
|
}
|
||||||
in.Delim(']')
|
in.Delim(']')
|
||||||
@ -1017,11 +1073,11 @@ func easyjson42239ddeEncodeGithubComKhliengDispatchServer8(out *jwriter.Writer,
|
|||||||
}
|
}
|
||||||
{
|
{
|
||||||
out.RawByte('[')
|
out.RawByte('[')
|
||||||
for v8, v9 := range in.Results {
|
for v10, v11 := range in.Results {
|
||||||
if v8 > 0 {
|
if v10 > 0 {
|
||||||
out.RawByte(',')
|
out.RawByte(',')
|
||||||
}
|
}
|
||||||
easyjson42239ddeEncodeGithubComKhliengDispatchStorage(out, v9)
|
easyjson42239ddeEncodeGithubComKhliengDispatchStorage(out, v11)
|
||||||
}
|
}
|
||||||
out.RawByte(']')
|
out.RawByte(']')
|
||||||
}
|
}
|
||||||
@ -1520,9 +1576,9 @@ func easyjson42239ddeDecodeGithubComKhliengDispatchServer13(in *jlexer.Lexer, ou
|
|||||||
out.Channels = (out.Channels)[:0]
|
out.Channels = (out.Channels)[:0]
|
||||||
}
|
}
|
||||||
for !in.IsDelim(']') {
|
for !in.IsDelim(']') {
|
||||||
var v10 string
|
var v12 string
|
||||||
v10 = string(in.String())
|
v12 = string(in.String())
|
||||||
out.Channels = append(out.Channels, v10)
|
out.Channels = append(out.Channels, v12)
|
||||||
in.WantComma()
|
in.WantComma()
|
||||||
}
|
}
|
||||||
in.Delim(']')
|
in.Delim(']')
|
||||||
@ -1583,11 +1639,11 @@ func easyjson42239ddeEncodeGithubComKhliengDispatchServer13(out *jwriter.Writer,
|
|||||||
}
|
}
|
||||||
{
|
{
|
||||||
out.RawByte('[')
|
out.RawByte('[')
|
||||||
for v11, v12 := range in.Channels {
|
for v13, v14 := range in.Channels {
|
||||||
if v11 > 0 {
|
if v13 > 0 {
|
||||||
out.RawByte(',')
|
out.RawByte(',')
|
||||||
}
|
}
|
||||||
out.String(string(v12))
|
out.String(string(v14))
|
||||||
}
|
}
|
||||||
out.RawByte(']')
|
out.RawByte(']')
|
||||||
}
|
}
|
||||||
@ -1952,9 +2008,9 @@ func easyjson42239ddeDecodeGithubComKhliengDispatchServer17(in *jlexer.Lexer, ou
|
|||||||
out.Messages = (out.Messages)[:0]
|
out.Messages = (out.Messages)[:0]
|
||||||
}
|
}
|
||||||
for !in.IsDelim(']') {
|
for !in.IsDelim(']') {
|
||||||
var v13 storage.Message
|
var v15 storage.Message
|
||||||
easyjson42239ddeDecodeGithubComKhliengDispatchStorage(in, &v13)
|
easyjson42239ddeDecodeGithubComKhliengDispatchStorage(in, &v15)
|
||||||
out.Messages = append(out.Messages, v13)
|
out.Messages = append(out.Messages, v15)
|
||||||
in.WantComma()
|
in.WantComma()
|
||||||
}
|
}
|
||||||
in.Delim(']')
|
in.Delim(']')
|
||||||
@ -2007,11 +2063,11 @@ func easyjson42239ddeEncodeGithubComKhliengDispatchServer17(out *jwriter.Writer,
|
|||||||
}
|
}
|
||||||
{
|
{
|
||||||
out.RawByte('[')
|
out.RawByte('[')
|
||||||
for v14, v15 := range in.Messages {
|
for v16, v17 := range in.Messages {
|
||||||
if v14 > 0 {
|
if v16 > 0 {
|
||||||
out.RawByte(',')
|
out.RawByte(',')
|
||||||
}
|
}
|
||||||
easyjson42239ddeEncodeGithubComKhliengDispatchStorage(out, v15)
|
easyjson42239ddeEncodeGithubComKhliengDispatchStorage(out, v17)
|
||||||
}
|
}
|
||||||
out.RawByte(']')
|
out.RawByte(']')
|
||||||
}
|
}
|
||||||
@ -2232,9 +2288,9 @@ func easyjson42239ddeDecodeGithubComKhliengDispatchServer19(in *jlexer.Lexer, ou
|
|||||||
out.Content = (out.Content)[:0]
|
out.Content = (out.Content)[:0]
|
||||||
}
|
}
|
||||||
for !in.IsDelim(']') {
|
for !in.IsDelim(']') {
|
||||||
var v16 string
|
var v18 string
|
||||||
v16 = string(in.String())
|
v18 = string(in.String())
|
||||||
out.Content = append(out.Content, v16)
|
out.Content = append(out.Content, v18)
|
||||||
in.WantComma()
|
in.WantComma()
|
||||||
}
|
}
|
||||||
in.Delim(']')
|
in.Delim(']')
|
||||||
@ -2283,11 +2339,11 @@ func easyjson42239ddeEncodeGithubComKhliengDispatchServer19(out *jwriter.Writer,
|
|||||||
}
|
}
|
||||||
{
|
{
|
||||||
out.RawByte('[')
|
out.RawByte('[')
|
||||||
for v17, v18 := range in.Content {
|
for v19, v20 := range in.Content {
|
||||||
if v17 > 0 {
|
if v19 > 0 {
|
||||||
out.RawByte(',')
|
out.RawByte(',')
|
||||||
}
|
}
|
||||||
out.String(string(v18))
|
out.String(string(v20))
|
||||||
}
|
}
|
||||||
out.RawByte(']')
|
out.RawByte(']')
|
||||||
}
|
}
|
||||||
@ -2452,9 +2508,9 @@ func easyjson42239ddeDecodeGithubComKhliengDispatchServer21(in *jlexer.Lexer, ou
|
|||||||
out.Channels = (out.Channels)[:0]
|
out.Channels = (out.Channels)[:0]
|
||||||
}
|
}
|
||||||
for !in.IsDelim(']') {
|
for !in.IsDelim(']') {
|
||||||
var v19 string
|
var v21 string
|
||||||
v19 = string(in.String())
|
v21 = string(in.String())
|
||||||
out.Channels = append(out.Channels, v19)
|
out.Channels = append(out.Channels, v21)
|
||||||
in.WantComma()
|
in.WantComma()
|
||||||
}
|
}
|
||||||
in.Delim(']')
|
in.Delim(']')
|
||||||
@ -2503,11 +2559,11 @@ func easyjson42239ddeEncodeGithubComKhliengDispatchServer21(out *jwriter.Writer,
|
|||||||
}
|
}
|
||||||
{
|
{
|
||||||
out.RawByte('[')
|
out.RawByte('[')
|
||||||
for v20, v21 := range in.Channels {
|
for v22, v23 := range in.Channels {
|
||||||
if v20 > 0 {
|
if v22 > 0 {
|
||||||
out.RawByte(',')
|
out.RawByte(',')
|
||||||
}
|
}
|
||||||
out.String(string(v21))
|
out.String(string(v23))
|
||||||
}
|
}
|
||||||
out.RawByte(']')
|
out.RawByte(']')
|
||||||
}
|
}
|
||||||
@ -2823,7 +2879,134 @@ func (v *FetchMessages) UnmarshalJSON(data []byte) error {
|
|||||||
func (v *FetchMessages) UnmarshalEasyJSON(l *jlexer.Lexer) {
|
func (v *FetchMessages) UnmarshalEasyJSON(l *jlexer.Lexer) {
|
||||||
easyjson42239ddeDecodeGithubComKhliengDispatchServer24(l, v)
|
easyjson42239ddeDecodeGithubComKhliengDispatchServer24(l, v)
|
||||||
}
|
}
|
||||||
func easyjson42239ddeDecodeGithubComKhliengDispatchServer25(in *jlexer.Lexer, out *Error) {
|
func easyjson42239ddeDecodeGithubComKhliengDispatchServer25(in *jlexer.Lexer, out *Features) {
|
||||||
|
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 "server":
|
||||||
|
out.Server = string(in.String())
|
||||||
|
case "features":
|
||||||
|
if in.IsNull() {
|
||||||
|
in.Skip()
|
||||||
|
} else {
|
||||||
|
in.Delim('{')
|
||||||
|
if !in.IsDelim('}') {
|
||||||
|
out.Features = make(map[string]interface{})
|
||||||
|
} else {
|
||||||
|
out.Features = nil
|
||||||
|
}
|
||||||
|
for !in.IsDelim('}') {
|
||||||
|
key := string(in.String())
|
||||||
|
in.WantColon()
|
||||||
|
var v24 interface{}
|
||||||
|
if m, ok := v24.(easyjson.Unmarshaler); ok {
|
||||||
|
m.UnmarshalEasyJSON(in)
|
||||||
|
} else if m, ok := v24.(json.Unmarshaler); ok {
|
||||||
|
_ = m.UnmarshalJSON(in.Raw())
|
||||||
|
} else {
|
||||||
|
v24 = in.Interface()
|
||||||
|
}
|
||||||
|
(out.Features)[key] = v24
|
||||||
|
in.WantComma()
|
||||||
|
}
|
||||||
|
in.Delim('}')
|
||||||
|
}
|
||||||
|
default:
|
||||||
|
in.SkipRecursive()
|
||||||
|
}
|
||||||
|
in.WantComma()
|
||||||
|
}
|
||||||
|
in.Delim('}')
|
||||||
|
if isTopLevel {
|
||||||
|
in.Consumed()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
func easyjson42239ddeEncodeGithubComKhliengDispatchServer25(out *jwriter.Writer, in Features) {
|
||||||
|
out.RawByte('{')
|
||||||
|
first := true
|
||||||
|
_ = first
|
||||||
|
if in.Server != "" {
|
||||||
|
const prefix string = ",\"server\":"
|
||||||
|
if first {
|
||||||
|
first = false
|
||||||
|
out.RawString(prefix[1:])
|
||||||
|
} else {
|
||||||
|
out.RawString(prefix)
|
||||||
|
}
|
||||||
|
out.String(string(in.Server))
|
||||||
|
}
|
||||||
|
if len(in.Features) != 0 {
|
||||||
|
const prefix string = ",\"features\":"
|
||||||
|
if first {
|
||||||
|
first = false
|
||||||
|
out.RawString(prefix[1:])
|
||||||
|
} else {
|
||||||
|
out.RawString(prefix)
|
||||||
|
}
|
||||||
|
{
|
||||||
|
out.RawByte('{')
|
||||||
|
v25First := true
|
||||||
|
for v25Name, v25Value := range in.Features {
|
||||||
|
if v25First {
|
||||||
|
v25First = false
|
||||||
|
} else {
|
||||||
|
out.RawByte(',')
|
||||||
|
}
|
||||||
|
out.String(string(v25Name))
|
||||||
|
out.RawByte(':')
|
||||||
|
if m, ok := v25Value.(easyjson.Marshaler); ok {
|
||||||
|
m.MarshalEasyJSON(out)
|
||||||
|
} else if m, ok := v25Value.(json.Marshaler); ok {
|
||||||
|
out.Raw(m.MarshalJSON())
|
||||||
|
} else {
|
||||||
|
out.Raw(json.Marshal(v25Value))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
out.RawByte('}')
|
||||||
|
}
|
||||||
|
}
|
||||||
|
out.RawByte('}')
|
||||||
|
}
|
||||||
|
|
||||||
|
// MarshalJSON supports json.Marshaler interface
|
||||||
|
func (v Features) MarshalJSON() ([]byte, error) {
|
||||||
|
w := jwriter.Writer{}
|
||||||
|
easyjson42239ddeEncodeGithubComKhliengDispatchServer25(&w, v)
|
||||||
|
return w.Buffer.BuildBytes(), w.Error
|
||||||
|
}
|
||||||
|
|
||||||
|
// MarshalEasyJSON supports easyjson.Marshaler interface
|
||||||
|
func (v Features) MarshalEasyJSON(w *jwriter.Writer) {
|
||||||
|
easyjson42239ddeEncodeGithubComKhliengDispatchServer25(w, v)
|
||||||
|
}
|
||||||
|
|
||||||
|
// UnmarshalJSON supports json.Unmarshaler interface
|
||||||
|
func (v *Features) UnmarshalJSON(data []byte) error {
|
||||||
|
r := jlexer.Lexer{Data: data}
|
||||||
|
easyjson42239ddeDecodeGithubComKhliengDispatchServer25(&r, v)
|
||||||
|
return r.Error()
|
||||||
|
}
|
||||||
|
|
||||||
|
// UnmarshalEasyJSON supports easyjson.Unmarshaler interface
|
||||||
|
func (v *Features) UnmarshalEasyJSON(l *jlexer.Lexer) {
|
||||||
|
easyjson42239ddeDecodeGithubComKhliengDispatchServer25(l, v)
|
||||||
|
}
|
||||||
|
func easyjson42239ddeDecodeGithubComKhliengDispatchServer26(in *jlexer.Lexer, out *Error) {
|
||||||
isTopLevel := in.IsStart()
|
isTopLevel := in.IsStart()
|
||||||
if in.IsNull() {
|
if in.IsNull() {
|
||||||
if isTopLevel {
|
if isTopLevel {
|
||||||
@ -2856,7 +3039,7 @@ func easyjson42239ddeDecodeGithubComKhliengDispatchServer25(in *jlexer.Lexer, ou
|
|||||||
in.Consumed()
|
in.Consumed()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
func easyjson42239ddeEncodeGithubComKhliengDispatchServer25(out *jwriter.Writer, in Error) {
|
func easyjson42239ddeEncodeGithubComKhliengDispatchServer26(out *jwriter.Writer, in Error) {
|
||||||
out.RawByte('{')
|
out.RawByte('{')
|
||||||
first := true
|
first := true
|
||||||
_ = first
|
_ = first
|
||||||
@ -2886,27 +3069,27 @@ func easyjson42239ddeEncodeGithubComKhliengDispatchServer25(out *jwriter.Writer,
|
|||||||
// MarshalJSON supports json.Marshaler interface
|
// MarshalJSON supports json.Marshaler interface
|
||||||
func (v Error) MarshalJSON() ([]byte, error) {
|
func (v Error) MarshalJSON() ([]byte, error) {
|
||||||
w := jwriter.Writer{}
|
w := jwriter.Writer{}
|
||||||
easyjson42239ddeEncodeGithubComKhliengDispatchServer25(&w, v)
|
easyjson42239ddeEncodeGithubComKhliengDispatchServer26(&w, v)
|
||||||
return w.Buffer.BuildBytes(), w.Error
|
return w.Buffer.BuildBytes(), w.Error
|
||||||
}
|
}
|
||||||
|
|
||||||
// MarshalEasyJSON supports easyjson.Marshaler interface
|
// MarshalEasyJSON supports easyjson.Marshaler interface
|
||||||
func (v Error) MarshalEasyJSON(w *jwriter.Writer) {
|
func (v Error) MarshalEasyJSON(w *jwriter.Writer) {
|
||||||
easyjson42239ddeEncodeGithubComKhliengDispatchServer25(w, v)
|
easyjson42239ddeEncodeGithubComKhliengDispatchServer26(w, v)
|
||||||
}
|
}
|
||||||
|
|
||||||
// UnmarshalJSON supports json.Unmarshaler interface
|
// UnmarshalJSON supports json.Unmarshaler interface
|
||||||
func (v *Error) UnmarshalJSON(data []byte) error {
|
func (v *Error) UnmarshalJSON(data []byte) error {
|
||||||
r := jlexer.Lexer{Data: data}
|
r := jlexer.Lexer{Data: data}
|
||||||
easyjson42239ddeDecodeGithubComKhliengDispatchServer25(&r, v)
|
easyjson42239ddeDecodeGithubComKhliengDispatchServer26(&r, v)
|
||||||
return r.Error()
|
return r.Error()
|
||||||
}
|
}
|
||||||
|
|
||||||
// UnmarshalEasyJSON supports easyjson.Unmarshaler interface
|
// UnmarshalEasyJSON supports easyjson.Unmarshaler interface
|
||||||
func (v *Error) UnmarshalEasyJSON(l *jlexer.Lexer) {
|
func (v *Error) UnmarshalEasyJSON(l *jlexer.Lexer) {
|
||||||
easyjson42239ddeDecodeGithubComKhliengDispatchServer25(l, v)
|
easyjson42239ddeDecodeGithubComKhliengDispatchServer26(l, v)
|
||||||
}
|
}
|
||||||
func easyjson42239ddeDecodeGithubComKhliengDispatchServer26(in *jlexer.Lexer, out *ConnectionUpdate) {
|
func easyjson42239ddeDecodeGithubComKhliengDispatchServer27(in *jlexer.Lexer, out *ConnectionUpdate) {
|
||||||
isTopLevel := in.IsStart()
|
isTopLevel := in.IsStart()
|
||||||
if in.IsNull() {
|
if in.IsNull() {
|
||||||
if isTopLevel {
|
if isTopLevel {
|
||||||
@ -2943,7 +3126,7 @@ func easyjson42239ddeDecodeGithubComKhliengDispatchServer26(in *jlexer.Lexer, ou
|
|||||||
in.Consumed()
|
in.Consumed()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
func easyjson42239ddeEncodeGithubComKhliengDispatchServer26(out *jwriter.Writer, in ConnectionUpdate) {
|
func easyjson42239ddeEncodeGithubComKhliengDispatchServer27(out *jwriter.Writer, in ConnectionUpdate) {
|
||||||
out.RawByte('{')
|
out.RawByte('{')
|
||||||
first := true
|
first := true
|
||||||
_ = first
|
_ = first
|
||||||
@ -2993,27 +3176,27 @@ func easyjson42239ddeEncodeGithubComKhliengDispatchServer26(out *jwriter.Writer,
|
|||||||
// MarshalJSON supports json.Marshaler interface
|
// MarshalJSON supports json.Marshaler interface
|
||||||
func (v ConnectionUpdate) MarshalJSON() ([]byte, error) {
|
func (v ConnectionUpdate) MarshalJSON() ([]byte, error) {
|
||||||
w := jwriter.Writer{}
|
w := jwriter.Writer{}
|
||||||
easyjson42239ddeEncodeGithubComKhliengDispatchServer26(&w, v)
|
easyjson42239ddeEncodeGithubComKhliengDispatchServer27(&w, v)
|
||||||
return w.Buffer.BuildBytes(), w.Error
|
return w.Buffer.BuildBytes(), w.Error
|
||||||
}
|
}
|
||||||
|
|
||||||
// MarshalEasyJSON supports easyjson.Marshaler interface
|
// MarshalEasyJSON supports easyjson.Marshaler interface
|
||||||
func (v ConnectionUpdate) MarshalEasyJSON(w *jwriter.Writer) {
|
func (v ConnectionUpdate) MarshalEasyJSON(w *jwriter.Writer) {
|
||||||
easyjson42239ddeEncodeGithubComKhliengDispatchServer26(w, v)
|
easyjson42239ddeEncodeGithubComKhliengDispatchServer27(w, v)
|
||||||
}
|
}
|
||||||
|
|
||||||
// UnmarshalJSON supports json.Unmarshaler interface
|
// UnmarshalJSON supports json.Unmarshaler interface
|
||||||
func (v *ConnectionUpdate) UnmarshalJSON(data []byte) error {
|
func (v *ConnectionUpdate) UnmarshalJSON(data []byte) error {
|
||||||
r := jlexer.Lexer{Data: data}
|
r := jlexer.Lexer{Data: data}
|
||||||
easyjson42239ddeDecodeGithubComKhliengDispatchServer26(&r, v)
|
easyjson42239ddeDecodeGithubComKhliengDispatchServer27(&r, v)
|
||||||
return r.Error()
|
return r.Error()
|
||||||
}
|
}
|
||||||
|
|
||||||
// UnmarshalEasyJSON supports easyjson.Unmarshaler interface
|
// UnmarshalEasyJSON supports easyjson.Unmarshaler interface
|
||||||
func (v *ConnectionUpdate) UnmarshalEasyJSON(l *jlexer.Lexer) {
|
func (v *ConnectionUpdate) UnmarshalEasyJSON(l *jlexer.Lexer) {
|
||||||
easyjson42239ddeDecodeGithubComKhliengDispatchServer26(l, v)
|
easyjson42239ddeDecodeGithubComKhliengDispatchServer27(l, v)
|
||||||
}
|
}
|
||||||
func easyjson42239ddeDecodeGithubComKhliengDispatchServer27(in *jlexer.Lexer, out *ClientCert) {
|
func easyjson42239ddeDecodeGithubComKhliengDispatchServer28(in *jlexer.Lexer, out *ClientCert) {
|
||||||
isTopLevel := in.IsStart()
|
isTopLevel := in.IsStart()
|
||||||
if in.IsNull() {
|
if in.IsNull() {
|
||||||
if isTopLevel {
|
if isTopLevel {
|
||||||
@ -3046,7 +3229,7 @@ func easyjson42239ddeDecodeGithubComKhliengDispatchServer27(in *jlexer.Lexer, ou
|
|||||||
in.Consumed()
|
in.Consumed()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
func easyjson42239ddeEncodeGithubComKhliengDispatchServer27(out *jwriter.Writer, in ClientCert) {
|
func easyjson42239ddeEncodeGithubComKhliengDispatchServer28(out *jwriter.Writer, in ClientCert) {
|
||||||
out.RawByte('{')
|
out.RawByte('{')
|
||||||
first := true
|
first := true
|
||||||
_ = first
|
_ = first
|
||||||
@ -3076,27 +3259,27 @@ func easyjson42239ddeEncodeGithubComKhliengDispatchServer27(out *jwriter.Writer,
|
|||||||
// MarshalJSON supports json.Marshaler interface
|
// MarshalJSON supports json.Marshaler interface
|
||||||
func (v ClientCert) MarshalJSON() ([]byte, error) {
|
func (v ClientCert) MarshalJSON() ([]byte, error) {
|
||||||
w := jwriter.Writer{}
|
w := jwriter.Writer{}
|
||||||
easyjson42239ddeEncodeGithubComKhliengDispatchServer27(&w, v)
|
easyjson42239ddeEncodeGithubComKhliengDispatchServer28(&w, v)
|
||||||
return w.Buffer.BuildBytes(), w.Error
|
return w.Buffer.BuildBytes(), w.Error
|
||||||
}
|
}
|
||||||
|
|
||||||
// MarshalEasyJSON supports easyjson.Marshaler interface
|
// MarshalEasyJSON supports easyjson.Marshaler interface
|
||||||
func (v ClientCert) MarshalEasyJSON(w *jwriter.Writer) {
|
func (v ClientCert) MarshalEasyJSON(w *jwriter.Writer) {
|
||||||
easyjson42239ddeEncodeGithubComKhliengDispatchServer27(w, v)
|
easyjson42239ddeEncodeGithubComKhliengDispatchServer28(w, v)
|
||||||
}
|
}
|
||||||
|
|
||||||
// UnmarshalJSON supports json.Unmarshaler interface
|
// UnmarshalJSON supports json.Unmarshaler interface
|
||||||
func (v *ClientCert) UnmarshalJSON(data []byte) error {
|
func (v *ClientCert) UnmarshalJSON(data []byte) error {
|
||||||
r := jlexer.Lexer{Data: data}
|
r := jlexer.Lexer{Data: data}
|
||||||
easyjson42239ddeDecodeGithubComKhliengDispatchServer27(&r, v)
|
easyjson42239ddeDecodeGithubComKhliengDispatchServer28(&r, v)
|
||||||
return r.Error()
|
return r.Error()
|
||||||
}
|
}
|
||||||
|
|
||||||
// UnmarshalEasyJSON supports easyjson.Unmarshaler interface
|
// UnmarshalEasyJSON supports easyjson.Unmarshaler interface
|
||||||
func (v *ClientCert) UnmarshalEasyJSON(l *jlexer.Lexer) {
|
func (v *ClientCert) UnmarshalEasyJSON(l *jlexer.Lexer) {
|
||||||
easyjson42239ddeDecodeGithubComKhliengDispatchServer27(l, v)
|
easyjson42239ddeDecodeGithubComKhliengDispatchServer28(l, v)
|
||||||
}
|
}
|
||||||
func easyjson42239ddeDecodeGithubComKhliengDispatchServer28(in *jlexer.Lexer, out *ChannelSearchResult) {
|
func easyjson42239ddeDecodeGithubComKhliengDispatchServer29(in *jlexer.Lexer, out *ChannelSearchResult) {
|
||||||
isTopLevel := in.IsStart()
|
isTopLevel := in.IsStart()
|
||||||
if in.IsNull() {
|
if in.IsNull() {
|
||||||
if isTopLevel {
|
if isTopLevel {
|
||||||
@ -3131,17 +3314,17 @@ func easyjson42239ddeDecodeGithubComKhliengDispatchServer28(in *jlexer.Lexer, ou
|
|||||||
out.Results = (out.Results)[:0]
|
out.Results = (out.Results)[:0]
|
||||||
}
|
}
|
||||||
for !in.IsDelim(']') {
|
for !in.IsDelim(']') {
|
||||||
var v22 *storage.ChannelListItem
|
var v26 *storage.ChannelListItem
|
||||||
if in.IsNull() {
|
if in.IsNull() {
|
||||||
in.Skip()
|
in.Skip()
|
||||||
v22 = nil
|
v26 = nil
|
||||||
} else {
|
} else {
|
||||||
if v22 == nil {
|
if v26 == nil {
|
||||||
v22 = new(storage.ChannelListItem)
|
v26 = new(storage.ChannelListItem)
|
||||||
}
|
}
|
||||||
easyjson42239ddeDecodeGithubComKhliengDispatchStorage1(in, &*v22)
|
easyjson42239ddeDecodeGithubComKhliengDispatchStorage1(in, &*v26)
|
||||||
}
|
}
|
||||||
out.Results = append(out.Results, v22)
|
out.Results = append(out.Results, v26)
|
||||||
in.WantComma()
|
in.WantComma()
|
||||||
}
|
}
|
||||||
in.Delim(']')
|
in.Delim(']')
|
||||||
@ -3158,7 +3341,7 @@ func easyjson42239ddeDecodeGithubComKhliengDispatchServer28(in *jlexer.Lexer, ou
|
|||||||
in.Consumed()
|
in.Consumed()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
func easyjson42239ddeEncodeGithubComKhliengDispatchServer28(out *jwriter.Writer, in ChannelSearchResult) {
|
func easyjson42239ddeEncodeGithubComKhliengDispatchServer29(out *jwriter.Writer, in ChannelSearchResult) {
|
||||||
out.RawByte('{')
|
out.RawByte('{')
|
||||||
first := true
|
first := true
|
||||||
_ = first
|
_ = first
|
||||||
@ -3172,14 +3355,14 @@ func easyjson42239ddeEncodeGithubComKhliengDispatchServer28(out *jwriter.Writer,
|
|||||||
}
|
}
|
||||||
{
|
{
|
||||||
out.RawByte('[')
|
out.RawByte('[')
|
||||||
for v23, v24 := range in.Results {
|
for v27, v28 := range in.Results {
|
||||||
if v23 > 0 {
|
if v27 > 0 {
|
||||||
out.RawByte(',')
|
out.RawByte(',')
|
||||||
}
|
}
|
||||||
if v24 == nil {
|
if v28 == nil {
|
||||||
out.RawString("null")
|
out.RawString("null")
|
||||||
} else {
|
} else {
|
||||||
easyjson42239ddeEncodeGithubComKhliengDispatchStorage1(out, *v24)
|
easyjson42239ddeEncodeGithubComKhliengDispatchStorage1(out, *v28)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
out.RawByte(']')
|
out.RawByte(']')
|
||||||
@ -3201,25 +3384,25 @@ func easyjson42239ddeEncodeGithubComKhliengDispatchServer28(out *jwriter.Writer,
|
|||||||
// MarshalJSON supports json.Marshaler interface
|
// MarshalJSON supports json.Marshaler interface
|
||||||
func (v ChannelSearchResult) MarshalJSON() ([]byte, error) {
|
func (v ChannelSearchResult) MarshalJSON() ([]byte, error) {
|
||||||
w := jwriter.Writer{}
|
w := jwriter.Writer{}
|
||||||
easyjson42239ddeEncodeGithubComKhliengDispatchServer28(&w, v)
|
easyjson42239ddeEncodeGithubComKhliengDispatchServer29(&w, v)
|
||||||
return w.Buffer.BuildBytes(), w.Error
|
return w.Buffer.BuildBytes(), w.Error
|
||||||
}
|
}
|
||||||
|
|
||||||
// MarshalEasyJSON supports easyjson.Marshaler interface
|
// MarshalEasyJSON supports easyjson.Marshaler interface
|
||||||
func (v ChannelSearchResult) MarshalEasyJSON(w *jwriter.Writer) {
|
func (v ChannelSearchResult) MarshalEasyJSON(w *jwriter.Writer) {
|
||||||
easyjson42239ddeEncodeGithubComKhliengDispatchServer28(w, v)
|
easyjson42239ddeEncodeGithubComKhliengDispatchServer29(w, v)
|
||||||
}
|
}
|
||||||
|
|
||||||
// UnmarshalJSON supports json.Unmarshaler interface
|
// UnmarshalJSON supports json.Unmarshaler interface
|
||||||
func (v *ChannelSearchResult) UnmarshalJSON(data []byte) error {
|
func (v *ChannelSearchResult) UnmarshalJSON(data []byte) error {
|
||||||
r := jlexer.Lexer{Data: data}
|
r := jlexer.Lexer{Data: data}
|
||||||
easyjson42239ddeDecodeGithubComKhliengDispatchServer28(&r, v)
|
easyjson42239ddeDecodeGithubComKhliengDispatchServer29(&r, v)
|
||||||
return r.Error()
|
return r.Error()
|
||||||
}
|
}
|
||||||
|
|
||||||
// UnmarshalEasyJSON supports easyjson.Unmarshaler interface
|
// UnmarshalEasyJSON supports easyjson.Unmarshaler interface
|
||||||
func (v *ChannelSearchResult) UnmarshalEasyJSON(l *jlexer.Lexer) {
|
func (v *ChannelSearchResult) UnmarshalEasyJSON(l *jlexer.Lexer) {
|
||||||
easyjson42239ddeDecodeGithubComKhliengDispatchServer28(l, v)
|
easyjson42239ddeDecodeGithubComKhliengDispatchServer29(l, v)
|
||||||
}
|
}
|
||||||
func easyjson42239ddeDecodeGithubComKhliengDispatchStorage1(in *jlexer.Lexer, out *storage.ChannelListItem) {
|
func easyjson42239ddeDecodeGithubComKhliengDispatchStorage1(in *jlexer.Lexer, out *storage.ChannelListItem) {
|
||||||
isTopLevel := in.IsStart()
|
isTopLevel := in.IsStart()
|
||||||
@ -3292,7 +3475,7 @@ func easyjson42239ddeEncodeGithubComKhliengDispatchStorage1(out *jwriter.Writer,
|
|||||||
}
|
}
|
||||||
out.RawByte('}')
|
out.RawByte('}')
|
||||||
}
|
}
|
||||||
func easyjson42239ddeDecodeGithubComKhliengDispatchServer29(in *jlexer.Lexer, out *ChannelSearch) {
|
func easyjson42239ddeDecodeGithubComKhliengDispatchServer30(in *jlexer.Lexer, out *ChannelSearch) {
|
||||||
isTopLevel := in.IsStart()
|
isTopLevel := in.IsStart()
|
||||||
if in.IsNull() {
|
if in.IsNull() {
|
||||||
if isTopLevel {
|
if isTopLevel {
|
||||||
@ -3327,7 +3510,7 @@ func easyjson42239ddeDecodeGithubComKhliengDispatchServer29(in *jlexer.Lexer, ou
|
|||||||
in.Consumed()
|
in.Consumed()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
func easyjson42239ddeEncodeGithubComKhliengDispatchServer29(out *jwriter.Writer, in ChannelSearch) {
|
func easyjson42239ddeEncodeGithubComKhliengDispatchServer30(out *jwriter.Writer, in ChannelSearch) {
|
||||||
out.RawByte('{')
|
out.RawByte('{')
|
||||||
first := true
|
first := true
|
||||||
_ = first
|
_ = first
|
||||||
@ -3367,27 +3550,27 @@ func easyjson42239ddeEncodeGithubComKhliengDispatchServer29(out *jwriter.Writer,
|
|||||||
// MarshalJSON supports json.Marshaler interface
|
// MarshalJSON supports json.Marshaler interface
|
||||||
func (v ChannelSearch) MarshalJSON() ([]byte, error) {
|
func (v ChannelSearch) MarshalJSON() ([]byte, error) {
|
||||||
w := jwriter.Writer{}
|
w := jwriter.Writer{}
|
||||||
easyjson42239ddeEncodeGithubComKhliengDispatchServer29(&w, v)
|
easyjson42239ddeEncodeGithubComKhliengDispatchServer30(&w, v)
|
||||||
return w.Buffer.BuildBytes(), w.Error
|
return w.Buffer.BuildBytes(), w.Error
|
||||||
}
|
}
|
||||||
|
|
||||||
// MarshalEasyJSON supports easyjson.Marshaler interface
|
// MarshalEasyJSON supports easyjson.Marshaler interface
|
||||||
func (v ChannelSearch) MarshalEasyJSON(w *jwriter.Writer) {
|
func (v ChannelSearch) MarshalEasyJSON(w *jwriter.Writer) {
|
||||||
easyjson42239ddeEncodeGithubComKhliengDispatchServer29(w, v)
|
easyjson42239ddeEncodeGithubComKhliengDispatchServer30(w, v)
|
||||||
}
|
}
|
||||||
|
|
||||||
// UnmarshalJSON supports json.Unmarshaler interface
|
// UnmarshalJSON supports json.Unmarshaler interface
|
||||||
func (v *ChannelSearch) UnmarshalJSON(data []byte) error {
|
func (v *ChannelSearch) UnmarshalJSON(data []byte) error {
|
||||||
r := jlexer.Lexer{Data: data}
|
r := jlexer.Lexer{Data: data}
|
||||||
easyjson42239ddeDecodeGithubComKhliengDispatchServer29(&r, v)
|
easyjson42239ddeDecodeGithubComKhliengDispatchServer30(&r, v)
|
||||||
return r.Error()
|
return r.Error()
|
||||||
}
|
}
|
||||||
|
|
||||||
// UnmarshalEasyJSON supports easyjson.Unmarshaler interface
|
// UnmarshalEasyJSON supports easyjson.Unmarshaler interface
|
||||||
func (v *ChannelSearch) UnmarshalEasyJSON(l *jlexer.Lexer) {
|
func (v *ChannelSearch) UnmarshalEasyJSON(l *jlexer.Lexer) {
|
||||||
easyjson42239ddeDecodeGithubComKhliengDispatchServer29(l, v)
|
easyjson42239ddeDecodeGithubComKhliengDispatchServer30(l, v)
|
||||||
}
|
}
|
||||||
func easyjson42239ddeDecodeGithubComKhliengDispatchServer30(in *jlexer.Lexer, out *ChannelForward) {
|
func easyjson42239ddeDecodeGithubComKhliengDispatchServer31(in *jlexer.Lexer, out *ChannelForward) {
|
||||||
isTopLevel := in.IsStart()
|
isTopLevel := in.IsStart()
|
||||||
if in.IsNull() {
|
if in.IsNull() {
|
||||||
if isTopLevel {
|
if isTopLevel {
|
||||||
@ -3422,7 +3605,7 @@ func easyjson42239ddeDecodeGithubComKhliengDispatchServer30(in *jlexer.Lexer, ou
|
|||||||
in.Consumed()
|
in.Consumed()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
func easyjson42239ddeEncodeGithubComKhliengDispatchServer30(out *jwriter.Writer, in ChannelForward) {
|
func easyjson42239ddeEncodeGithubComKhliengDispatchServer31(out *jwriter.Writer, in ChannelForward) {
|
||||||
out.RawByte('{')
|
out.RawByte('{')
|
||||||
first := true
|
first := true
|
||||||
_ = first
|
_ = first
|
||||||
@ -3462,27 +3645,27 @@ func easyjson42239ddeEncodeGithubComKhliengDispatchServer30(out *jwriter.Writer,
|
|||||||
// MarshalJSON supports json.Marshaler interface
|
// MarshalJSON supports json.Marshaler interface
|
||||||
func (v ChannelForward) MarshalJSON() ([]byte, error) {
|
func (v ChannelForward) MarshalJSON() ([]byte, error) {
|
||||||
w := jwriter.Writer{}
|
w := jwriter.Writer{}
|
||||||
easyjson42239ddeEncodeGithubComKhliengDispatchServer30(&w, v)
|
easyjson42239ddeEncodeGithubComKhliengDispatchServer31(&w, v)
|
||||||
return w.Buffer.BuildBytes(), w.Error
|
return w.Buffer.BuildBytes(), w.Error
|
||||||
}
|
}
|
||||||
|
|
||||||
// MarshalEasyJSON supports easyjson.Marshaler interface
|
// MarshalEasyJSON supports easyjson.Marshaler interface
|
||||||
func (v ChannelForward) MarshalEasyJSON(w *jwriter.Writer) {
|
func (v ChannelForward) MarshalEasyJSON(w *jwriter.Writer) {
|
||||||
easyjson42239ddeEncodeGithubComKhliengDispatchServer30(w, v)
|
easyjson42239ddeEncodeGithubComKhliengDispatchServer31(w, v)
|
||||||
}
|
}
|
||||||
|
|
||||||
// UnmarshalJSON supports json.Unmarshaler interface
|
// UnmarshalJSON supports json.Unmarshaler interface
|
||||||
func (v *ChannelForward) UnmarshalJSON(data []byte) error {
|
func (v *ChannelForward) UnmarshalJSON(data []byte) error {
|
||||||
r := jlexer.Lexer{Data: data}
|
r := jlexer.Lexer{Data: data}
|
||||||
easyjson42239ddeDecodeGithubComKhliengDispatchServer30(&r, v)
|
easyjson42239ddeDecodeGithubComKhliengDispatchServer31(&r, v)
|
||||||
return r.Error()
|
return r.Error()
|
||||||
}
|
}
|
||||||
|
|
||||||
// UnmarshalEasyJSON supports easyjson.Unmarshaler interface
|
// UnmarshalEasyJSON supports easyjson.Unmarshaler interface
|
||||||
func (v *ChannelForward) UnmarshalEasyJSON(l *jlexer.Lexer) {
|
func (v *ChannelForward) UnmarshalEasyJSON(l *jlexer.Lexer) {
|
||||||
easyjson42239ddeDecodeGithubComKhliengDispatchServer30(l, v)
|
easyjson42239ddeDecodeGithubComKhliengDispatchServer31(l, v)
|
||||||
}
|
}
|
||||||
func easyjson42239ddeDecodeGithubComKhliengDispatchServer31(in *jlexer.Lexer, out *Away) {
|
func easyjson42239ddeDecodeGithubComKhliengDispatchServer32(in *jlexer.Lexer, out *Away) {
|
||||||
isTopLevel := in.IsStart()
|
isTopLevel := in.IsStart()
|
||||||
if in.IsNull() {
|
if in.IsNull() {
|
||||||
if isTopLevel {
|
if isTopLevel {
|
||||||
@ -3515,7 +3698,7 @@ func easyjson42239ddeDecodeGithubComKhliengDispatchServer31(in *jlexer.Lexer, ou
|
|||||||
in.Consumed()
|
in.Consumed()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
func easyjson42239ddeEncodeGithubComKhliengDispatchServer31(out *jwriter.Writer, in Away) {
|
func easyjson42239ddeEncodeGithubComKhliengDispatchServer32(out *jwriter.Writer, in Away) {
|
||||||
out.RawByte('{')
|
out.RawByte('{')
|
||||||
first := true
|
first := true
|
||||||
_ = first
|
_ = first
|
||||||
@ -3545,23 +3728,23 @@ func easyjson42239ddeEncodeGithubComKhliengDispatchServer31(out *jwriter.Writer,
|
|||||||
// MarshalJSON supports json.Marshaler interface
|
// MarshalJSON supports json.Marshaler interface
|
||||||
func (v Away) MarshalJSON() ([]byte, error) {
|
func (v Away) MarshalJSON() ([]byte, error) {
|
||||||
w := jwriter.Writer{}
|
w := jwriter.Writer{}
|
||||||
easyjson42239ddeEncodeGithubComKhliengDispatchServer31(&w, v)
|
easyjson42239ddeEncodeGithubComKhliengDispatchServer32(&w, v)
|
||||||
return w.Buffer.BuildBytes(), w.Error
|
return w.Buffer.BuildBytes(), w.Error
|
||||||
}
|
}
|
||||||
|
|
||||||
// MarshalEasyJSON supports easyjson.Marshaler interface
|
// MarshalEasyJSON supports easyjson.Marshaler interface
|
||||||
func (v Away) MarshalEasyJSON(w *jwriter.Writer) {
|
func (v Away) MarshalEasyJSON(w *jwriter.Writer) {
|
||||||
easyjson42239ddeEncodeGithubComKhliengDispatchServer31(w, v)
|
easyjson42239ddeEncodeGithubComKhliengDispatchServer32(w, v)
|
||||||
}
|
}
|
||||||
|
|
||||||
// UnmarshalJSON supports json.Unmarshaler interface
|
// UnmarshalJSON supports json.Unmarshaler interface
|
||||||
func (v *Away) UnmarshalJSON(data []byte) error {
|
func (v *Away) UnmarshalJSON(data []byte) error {
|
||||||
r := jlexer.Lexer{Data: data}
|
r := jlexer.Lexer{Data: data}
|
||||||
easyjson42239ddeDecodeGithubComKhliengDispatchServer31(&r, v)
|
easyjson42239ddeDecodeGithubComKhliengDispatchServer32(&r, v)
|
||||||
return r.Error()
|
return r.Error()
|
||||||
}
|
}
|
||||||
|
|
||||||
// UnmarshalEasyJSON supports easyjson.Unmarshaler interface
|
// UnmarshalEasyJSON supports easyjson.Unmarshaler interface
|
||||||
func (v *Away) UnmarshalEasyJSON(l *jlexer.Lexer) {
|
func (v *Away) UnmarshalEasyJSON(l *jlexer.Lexer) {
|
||||||
easyjson42239ddeDecodeGithubComKhliengDispatchServer31(l, v)
|
easyjson42239ddeDecodeGithubComKhliengDispatchServer32(l, v)
|
||||||
}
|
}
|
||||||
|
@ -109,6 +109,26 @@ func (s *BoltStore) DeleteUser(user *storage.User) error {
|
|||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (s *BoltStore) GetServer(user *storage.User, address string) (*storage.Server, error) {
|
||||||
|
var server *storage.Server
|
||||||
|
|
||||||
|
err := s.db.View(func(tx *bolt.Tx) error {
|
||||||
|
b := tx.Bucket(bucketServers)
|
||||||
|
id := serverID(user, address)
|
||||||
|
|
||||||
|
v := b.Get(id)
|
||||||
|
if v == nil {
|
||||||
|
return storage.ErrNotFound
|
||||||
|
} else {
|
||||||
|
server = &storage.Server{}
|
||||||
|
server.Unmarshal(v)
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
|
return server, err
|
||||||
|
}
|
||||||
|
|
||||||
func (s *BoltStore) GetServers(user *storage.User) ([]*storage.Server, error) {
|
func (s *BoltStore) GetServers(user *storage.User) ([]*storage.Server, error) {
|
||||||
var servers []*storage.Server
|
var servers []*storage.Server
|
||||||
|
|
||||||
@ -127,7 +147,7 @@ func (s *BoltStore) GetServers(user *storage.User) ([]*storage.Server, error) {
|
|||||||
return servers, nil
|
return servers, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (s *BoltStore) AddServer(user *storage.User, server *storage.Server) error {
|
func (s *BoltStore) SaveServer(user *storage.User, server *storage.Server) error {
|
||||||
return s.db.Batch(func(tx *bolt.Tx) error {
|
return s.db.Batch(func(tx *bolt.Tx) error {
|
||||||
b := tx.Bucket(bucketServers)
|
b := tx.Bucket(bucketServers)
|
||||||
data, _ := server.Marshal(nil)
|
data, _ := server.Marshal(nil)
|
||||||
|
@ -1,6 +1,7 @@
|
|||||||
package storage
|
package storage
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"errors"
|
||||||
"os"
|
"os"
|
||||||
|
|
||||||
"github.com/khlieng/dispatch/pkg/session"
|
"github.com/khlieng/dispatch/pkg/session"
|
||||||
@ -13,16 +14,19 @@ func Initialize(dir string) {
|
|||||||
os.MkdirAll(Path.Root(), 0700)
|
os.MkdirAll(Path.Root(), 0700)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
var (
|
||||||
|
ErrNotFound = errors.New("no item found")
|
||||||
|
)
|
||||||
|
|
||||||
type Store interface {
|
type Store interface {
|
||||||
GetUsers() ([]*User, error)
|
GetUsers() ([]*User, error)
|
||||||
SaveUser(user *User) error
|
SaveUser(user *User) error
|
||||||
DeleteUser(user *User) error
|
DeleteUser(user *User) error
|
||||||
|
|
||||||
|
GetServer(user *User, host string) (*Server, error)
|
||||||
GetServers(user *User) ([]*Server, error)
|
GetServers(user *User) ([]*Server, error)
|
||||||
AddServer(user *User, server *Server) error
|
SaveServer(user *User, server *Server) error
|
||||||
RemoveServer(user *User, host string) error
|
RemoveServer(user *User, host string) error
|
||||||
SetNick(user *User, nick, host string) error
|
|
||||||
SetServerName(user *User, name, host string) error
|
|
||||||
|
|
||||||
GetChannels(user *User) ([]*Channel, error)
|
GetChannels(user *User) ([]*Channel, error)
|
||||||
AddChannel(user *User, channel *Channel) error
|
AddChannel(user *User, channel *Channel) error
|
||||||
|
@ -137,12 +137,16 @@ type Server struct {
|
|||||||
Realname string
|
Realname string
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (u *User) GetServer(address string) (*Server, error) {
|
||||||
|
return u.store.GetServer(u, address)
|
||||||
|
}
|
||||||
|
|
||||||
func (u *User) GetServers() ([]*Server, error) {
|
func (u *User) GetServers() ([]*Server, error) {
|
||||||
return u.store.GetServers(u)
|
return u.store.GetServers(u)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (u *User) AddServer(server *Server) error {
|
func (u *User) AddServer(server *Server) error {
|
||||||
return u.store.AddServer(u, server)
|
return u.store.SaveServer(u, server)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (u *User) RemoveServer(address string) error {
|
func (u *User) RemoveServer(address string) error {
|
||||||
@ -150,13 +154,24 @@ func (u *User) RemoveServer(address string) error {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (u *User) SetNick(nick, address string) error {
|
func (u *User) SetNick(nick, address string) error {
|
||||||
return u.store.SetNick(u, nick, address)
|
server, err := u.GetServer(address)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
server.Nick = nick
|
||||||
|
return u.AddServer(server)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (u *User) SetServerName(name, address string) error {
|
func (u *User) SetServerName(name, address string) error {
|
||||||
return u.store.SetServerName(u, name, address)
|
server, err := u.GetServer(address)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
server.Name = name
|
||||||
|
return u.AddServer(server)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// TODO: Remove topic from disk schema
|
||||||
type Channel struct {
|
type Channel struct {
|
||||||
Server string
|
Server string
|
||||||
Name string
|
Name string
|
||||||
|
Loading…
Reference in New Issue
Block a user