diff options
| author | bt <bt@rctt.net> | 2026-04-19 21:32:53 +0200 |
|---|---|---|
| committer | bt <bt@rctt.net> | 2026-05-03 17:52:37 +0200 |
| commit | eec10d41af62fb9a93cd5fd79dcf94616701cc2a (patch) | |
| tree | d72068dcc4cb1aa43c2e0a2fae8ff094d41ed9c6 /core | |
| parent | c00e7dd589921e6be45918d4cd589e52e2b77036 (diff) | |
| download | solec-0.3.0.tar.gz solec-0.3.0.zip | |
[common] Basic group channels supportv0.3.0
Diffstat (limited to 'core')
| -rw-r--r-- | core/data.go | 51 | ||||
| -rw-r--r-- | core/payload.go | 35 |
2 files changed, 79 insertions, 7 deletions
diff --git a/core/data.go b/core/data.go index dd2777f..2a98347 100644 --- a/core/data.go +++ b/core/data.go @@ -23,15 +23,17 @@ const ( PayloadUserAuth = 0x04 PayloadMessage = 0x05 PayloadServerAuth = 0x06 + PayloadUsermode = 0x07 PayloadTest = 0xFF ) type ErrorType uint8 const ( - ErrorUnknown ErrorType = 0x00 - ErrorAuthFailed = 0x01 - ErrorNotFound = 0x02 + ErrorUnknown ErrorType = 0x00 + ErrorAuthFailed = 0x01 + ErrorNotFound = 0x02 + ErrorUnauthorized = 0x03 ) type ConnType uint8 @@ -42,6 +44,13 @@ const ( ConnTypeServer = 0x02 ) +type UsermodeType uint8 + +const ( + UsermodeNone UsermodeType = 0x00 + UsermodeInChannel = 0x01 +) + type Frame struct { Length uint16 Type PayloadType @@ -132,6 +141,8 @@ func Decode(buf io.Reader) (any, error) { return DecodeServerAuth(buf) case PayloadMessage: return DecodeMessage(buf) + case PayloadUsermode: + return DecodeUsermode(buf) case PayloadTest: return DecodeTest(buf) default: @@ -190,11 +201,37 @@ func decodeString(buf io.Reader, ptr *string) error { return nil } -func ReadAddr(addr string) (string, string, error) { - channel, host, ok := strings.Cut(addr, "@") +type Addr struct { + Channel string + Host string + Type AddrType +} + +type AddrType string + +const ( + AddrUser AddrType = "user" + AddrGroup = "group" +) + +func ReadAddr(addrStr string) (Addr, error) { + var ( + addr Addr + ok bool + ) + + addr.Channel, addr.Host, ok = strings.Cut(addrStr, "@") if !ok { - return "", "", ErrInvalidAddress + return addr, ErrInvalidAddress + } + + rest, ok := strings.CutPrefix(addr.Channel, "#") + if ok { + addr.Channel = rest + addr.Type = AddrGroup + } else { + addr.Type = AddrUser } - return channel, host, nil + return addr, nil } diff --git a/core/payload.go b/core/payload.go index e943647..3c3afa1 100644 --- a/core/payload.go +++ b/core/payload.go @@ -150,6 +150,41 @@ func DecodeMessage(buf io.Reader) (Message, error) { return m, nil } +type Usermode struct { + UserAddr string + ChannelName string + Mode UsermodeType +} + +func (u Usermode) Wrap() (PayloadType, []any) { + return PayloadUsermode, []any{ + u.UserAddr, + u.ChannelName, + uint8(u.Mode), + } +} + +func DecodeUsermode(buf io.Reader) (Usermode, error) { + var u Usermode + + err := decodeString(buf, &u.UserAddr) + if err != nil { + return u, err + } + + err = decodeString(buf, &u.ChannelName) + if err != nil { + return u, err + } + + err = decodeNumeric(buf, &u.Mode) + if err != nil { + return u, err + } + + return u, nil +} + type Test struct { Num1 uint8 Time1 time.Time |
