/*
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
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 (
)
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{}
// 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
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")
+}