]> Cypherpunks.ru repositories - goircd.git/blobdiff - client.go
Ability to authenticate users by nickname↔password database
[goircd.git] / client.go
index 632bf1fb339b3fb7ee8e86e6e9ca1f447401b633..4f48daf90be4f1f0981b96f6e30ca04fa1f438a0 100644 (file)
--- a/client.go
+++ b/client.go
@@ -26,19 +26,23 @@ import (
 )
 
 const (
-       CRLF     = "\x0d\x0a"
-       BUF_SIZE = 1380
+       CRLF    = "\x0d\x0a"
+       BufSize = 1380
 )
 
 type Client struct {
        hostname   string
        conn       net.Conn
        registered bool
-       ping_sent  bool
-       timestamp  time.Time
        nickname   string
        username   string
        realname   string
+       password   string
+}
+
+type ClientAlivenessState struct {
+       pingSent  bool
+       timestamp time.Time
 }
 
 func (client Client) String() string {
@@ -46,35 +50,32 @@ func (client Client) String() string {
 }
 
 func NewClient(hostname string, conn net.Conn) *Client {
-       return &Client{hostname: hostname, conn: conn, nickname: "*"}
+       return &Client{hostname: hostname, conn: conn, nickname: "*", password: ""}
 }
 
 // Client processor blockingly reads everything remote client sends,
 // splits messages by CRLF and send them to Daemon gorouting for processing
 // it futher. Also it can signalize that client is unavailable (disconnected).
-func (client *Client) Processor(sink chan ClientEvent) {
-       var buf_net []byte
+func (client *Client) Processor(sink chan<- ClientEvent) {
+       var bufNet []byte
        buf := make([]byte, 0)
-       log.Println("New client", client)
-       sink <- ClientEvent{client, EVENT_NEW, ""}
+       log.Println(client, "New client")
+       sink <- ClientEvent{client, EventNew, ""}
        for {
-               buf_net = make([]byte, BUF_SIZE)
-               _, err := client.conn.Read(buf_net)
+               bufNet = make([]byte, BufSize)
+               _, err := client.conn.Read(bufNet)
                if err != nil {
-                       log.Println(client, "connection lost", err)
-                       sink <- ClientEvent{client, EVENT_DEL, ""}
+                       sink <- ClientEvent{client, EventDel, ""}
                        break
                }
-               client.timestamp = time.Now()
-               client.ping_sent = false
-               buf_net = bytes.TrimRight(buf_net, "\x00")
-               buf = append(buf, buf_net...)
+               bufNet = bytes.TrimRight(bufNet, "\x00")
+               buf = append(buf, bufNet...)
                if !bytes.HasSuffix(buf, []byte(CRLF)) {
                        continue
                }
                for _, msg := range bytes.Split(buf[:len(buf)-2], []byte(CRLF)) {
                        if len(msg) > 0 {
-                               sink <- ClientEvent{client, EVENT_MSG, string(msg)}
+                               sink <- ClientEvent{client, EventMsg, string(msg)}
                        }
                }
                buf = []byte{}
@@ -117,3 +118,7 @@ func (client *Client) ReplyNotEnoughParameters(command string) {
 func (client *Client) ReplyNoChannel(channel string) {
        client.ReplyNicknamed("403", channel, "No such channel")
 }
+
+func (client *Client) ReplyNoNickChan(channel string) {
+       client.ReplyNicknamed("401", channel, "No such nick/channel")
+}