diff options
| author | bt <bt@rctt.net> | 2026-04-10 20:07:48 +0200 |
|---|---|---|
| committer | bt <bt@rctt.net> | 2026-04-10 20:07:48 +0200 |
| commit | 74763b4b327f620c933f78b2a65d8704e8aa8e12 (patch) | |
| tree | ff7f3ab92bf369e2d1ff613705bca00c1337decb /client/client.go | |
| parent | 75504a81885db55a3f5f9041dcda6b9d2ef421b2 (diff) | |
| download | solec-74763b4b327f620c933f78b2a65d8704e8aa8e12.tar.gz solec-74763b4b327f620c933f78b2a65d8704e8aa8e12.zip | |
[client] Move client implementation to separate packagev0.1.0
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) + } +} |
