summaryrefslogtreecommitdiffstats
path: root/core
diff options
context:
space:
mode:
Diffstat (limited to 'core')
-rw-r--r--core/data.go51
-rw-r--r--core/payload.go35
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