summaryrefslogtreecommitdiffstats
path: root/client/client.go
diff options
context:
space:
mode:
Diffstat (limited to 'client/client.go')
-rw-r--r--client/client.go80
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)
+ }
+}