]> Cypherpunks.ru repositories - goircd.git/blobdiff - client.go
HasPrefix is not necessary before TrimPrefix
[goircd.git] / client.go
index 632bf1fb339b3fb7ee8e86e6e9ca1f447401b633..95dd93f60d9e7958d5eeec9229284cb96ab403cb 100644 (file)
--- a/client.go
+++ b/client.go
@@ -1,6 +1,6 @@
 /*
 goircd -- minimalistic simple Internet Relay Chat (IRC) server
-Copyright (C) 2014 Sergey Matveev <stargrave@stargrave.org>
+Copyright (C) 2014-2015 Sergey Matveev <stargrave@stargrave.org>
 
 This program is free software: you can redistribute it and/or modify
 it under the terms of the GNU General Public License as published by
@@ -15,6 +15,7 @@ GNU General Public License for more details.
 You should have received a copy of the GNU General Public License
 along with this program.  If not, see <http://www.gnu.org/licenses/>.
 */
+
 package main
 
 import (
@@ -26,55 +27,57 @@ import (
 )
 
 const (
-       CRLF     = "\x0d\x0a"
-       BUF_SIZE = 1380
+       CRLF    = "\x0d\x0a"
+       BufSize = 1380
 )
 
 type Client struct {
-       hostname   string
+       hostname   *string
        conn       net.Conn
        registered bool
-       ping_sent  bool
-       timestamp  time.Time
        nickname   string
        username   string
        realname   string
+       password   string
+       away       *string
+}
+
+type ClientAlivenessState struct {
+       pingSent  bool
+       timestamp time.Time
 }
 
 func (client Client) String() string {
        return client.nickname + "!" + client.username + "@" + client.conn.RemoteAddr().String()
 }
 
-func NewClient(hostname string, conn net.Conn) *Client {
-       return &Client{hostname: hostname, conn: conn, nickname: "*"}
+func NewClient(hostname *string, conn net.Conn) *Client {
+       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{}
@@ -88,7 +91,7 @@ func (client *Client) Msg(text string) {
 
 // Send message from server. It has ": servername" prefix.
 func (client *Client) Reply(text string) {
-       client.Msg(":" + client.hostname + " " + text)
+       client.Msg(":" + *client.hostname + " " + text)
 }
 
 // Send server message, concatenating all provided text parts and
@@ -117,3 +120,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")
+}