diff options
Diffstat (limited to 'client/client.go')
| -rw-r--r-- | client/client.go | 80 |
1 files changed, 80 insertions, 0 deletions
diff --git a/client/client.go b/client/client.go new file mode 100644 index 0000000..a294bca --- /dev/null +++ b/client/client.go @@ -0,0 +1,80 @@ +package client + +import ( + "net" + + "git.rctt.net/solec/core" +) + +type Handler interface { + HandleMessage(msg core.Message) + HandleError(err error) +} + +type Client struct { + h Handler + conn net.Conn + + addr string + uname string + pass string +} + +func NewClient(handler Handler, addr, uname, pass string) *Client { + return &Client{ + h: handler, + addr: addr, + uname: uname, + pass: pass, + } +} + +func (c *Client) Connect() error { + var err error + c.conn, err = net.Dial("tcp", c.addr) + if err != nil { + return err + } + defer c.conn.Close() + + hs := core.Handshake{0, 1} + if err := core.Send(c.conn, hs); err != nil { + return err + } + + auth := core.Auth{c.uname, c.pass} + if err := core.Send(c.conn, auth); err != nil { + return err + } + + c.read() + return nil +} + +func (c *Client) SendMessage(target, content string) error { + msg := core.Message{ + Source: c.uname + "@" + c.addr, + Target: target, + Content: content, + } + + return core.Send(c.conn, msg) +} + +func (c *Client) read() { + for { + payload, err := core.Read(c.conn) + if err != nil { + c.h.HandleError(err) + } + + c.handlePayload(payload) + } +} + +func (c *Client) handlePayload(payload any) { + switch v := payload.(type) { + case core.Message: + c.h.HandleMessage(v) + } +} |
