func (c *Client) readThread(signalChan chan signalCode) { for { select { case signal := <-signalChan: if signal == signalStop { return } default: c.connection.SetReadDeadline(time.Now().Add(time.Second * 3)) buf := make([]byte, 1024) ln, err := c.connection.Read(buf) if err != nil { if e, ok := err.(net.Error); ok && (!e.Timeout()) { logging.Warning("signaller", "[CLIENT] Fatal socket error: ", err, e.Temporary()) c.disconnect() return } continue } rawLines := buf[:ln] lines := bytes.Split(rawLines, []byte("\r\n")) for _, line := range lines { if len(line) > 0 { c.server.eventChan <- Event{client: c, event: command, input: string(line)} } } } } }
func SqlQueryServer(ws *websocket.Conn) { dbConn, err := sql.Open("postgres", "postgres://"+config.All().Database.Username+ ":"+config.All().Database.Password+ "@"+config.All().Database.Address+ "/"+config.All().Database.Name+ "?sslmode=require") if err != nil { logging.Error("data-websock", "DB error: ", err.Error()) return } defer dbConn.Close() for { var data struct { Type string Query string } err := websocket.JSON.Receive(ws, &data) if err != nil { logging.Warning("data-websock", "Recieve error: ", err.Error()) return } //process message switch data.Type { case "query": logging.Info("data-websock", "Got Query: ", data.Query) doQuery(data.Query, ws, dbConn) } } }
func (c *Client) disconnect() { logging.Warning("signaller", "client.disconnect()") c.connected = false c.signalChan <- signalStop if c.sendDisconnectedEvent { go func() { c.server.eventChan <- Event{client: c, event: disconnected} }() c.sendDisconnectedEvent = false } }
func (c *Client) writeThread(signalChan chan signalCode, outputChan chan string) { for { select { case signal := <-signalChan: if signal == signalStop { return } case output := <-outputChan: line := []byte(fmt.Sprintf("%s\r\n", output)) c.connection.SetWriteDeadline(time.Now().Add(time.Second * 10)) if _, err := c.connection.Write(line); err != nil { logging.Warning("signaller", "[CLIENT] Fatal socket error (write): ", err) c.disconnect() return } } } }
//Send a reply to a user with the code specified func (c *Client) reply(code replyCode, args ...string) { if c.connected == false { return } switch code { case rplWelcome: c.outputChan <- fmt.Sprintf(":%s 001 %s :Welcome to %s", c.server.name, c.nick, c.server.name) case rplJoin: c.outputChan <- fmt.Sprintf(":%s JOIN %s", args[0], args[1]) case rplPart: c.outputChan <- fmt.Sprintf(":%s PART %s %s", args[0], args[1], args[2]) case rplTopic: c.outputChan <- fmt.Sprintf(":%s 332 %s %s :%s", c.server.name, c.nick, args[0], args[1]) case rplNoTopic: c.outputChan <- fmt.Sprintf(":%s 331 %s %s :No topic is set", c.server.name, c.nick, args[0]) case rplNames: //TODO: break long lists up into multiple messages c.outputChan <- fmt.Sprintf(":%s 353 %s = %s :%s", c.server.name, c.nick, args[0], args[1]) c.outputChan <- fmt.Sprintf(":%s 366 %s %s :End of NAMES list", c.server.name, c.nick, args[0]) case rplNickChange: c.outputChan <- fmt.Sprintf(":%s NICK %s", args[0], args[1]) case rplKill: if len(args) < 2 { logging.Warning("signaller", "rplKill requested but second argument not provided") args = append(args, "") } c.outputChan <- fmt.Sprintf(":%s KILL %s A %s", args[0], c.nick, args[1]) case rplMsg: c.outputChan <- fmt.Sprintf(":%s PRIVMSG %s %s", args[0], args[1], args[2]) case rplList: for _, listItem := range args { c.outputChan <- fmt.Sprintf(":%s 322 %s %s", c.server.name, c.nick, listItem) } c.outputChan <- fmt.Sprintf(":%s 323 %s", c.server.name, c.nick) case rplOper: c.outputChan <- fmt.Sprintf(":%s 381 %s :You are now an operator", c.server.name, c.nick) case rplChannelModeIs: c.outputChan <- fmt.Sprintf(":%s 324 %s %s %s %s", c.server.name, c.nick, args[0], args[1], args[2]) case rplKick: c.outputChan <- fmt.Sprintf(":%s KICK %s %s %s", args[0], args[1], args[2], args[3]) case rplInfo: c.outputChan <- fmt.Sprintf(":%s 371 %s :%s", c.server.name, c.nick, args[0]) case rplVersion: c.outputChan <- fmt.Sprintf(":%s 351 %s %s", c.server.name, c.nick, args[0]) case rplMOTD: motd := args[0] c.outputChan <- fmt.Sprintf(":%s 375 %s :- Message of the day - ", c.server.name, c.nick) for size := len(motd); size > 0; size = len(motd) { if size <= 80 { c.outputChan <- fmt.Sprintf(":%s 372 %s :- %s", c.server.name, c.nick, motd) break } c.outputChan <- fmt.Sprintf(":%s 372 %s :- %s", c.server.name, c.nick, motd[:80]) motd = motd[80:] } c.outputChan <- fmt.Sprintf(":%s 376 %s :End of MOTD Command", c.server.name, c.nick) case rplPong: c.outputChan <- fmt.Sprintf(":%s PONG %s %s", c.server.name, c.nick, c.server.name) case errMoreArgs: c.outputChan <- fmt.Sprintf(":%s 461 %s :Not enough params", c.server.name, c.nick) case errNoNick: c.outputChan <- fmt.Sprintf(":%s 431 %s :No nickname given", c.server.name, c.nick) case errInvalidNick: c.outputChan <- fmt.Sprintf(":%s 432 %s %s :Erronenous nickname", c.server.name, c.nick, args[0]) case errNickInUse: c.outputChan <- fmt.Sprintf(":%s 433 %s %s :Nick already in use", c.server.name, c.nick, args[0]) case errAlreadyReg: c.outputChan <- fmt.Sprintf(":%s 462 :You need a valid nick first", c.server.name) case errNoSuchNick: c.outputChan <- fmt.Sprintf(":%s 401 %s %s :No such nick/channel", c.server.name, c.nick, args[0]) case errUnknownCommand: c.outputChan <- fmt.Sprintf(":%s 421 %s %s :Unknown command", c.server.name, c.nick, args[0]) case errNotReg: c.outputChan <- fmt.Sprintf(":%s 451 :You have not registered", c.server.name) case errPassword: c.outputChan <- fmt.Sprintf(":%s 464 %s :Error, password incorrect", c.server.name, c.nick) case errNoPriv: c.outputChan <- fmt.Sprintf(":%s 481 %s :Permission denied", c.server.name, c.nick) case errCannotSend: c.outputChan <- fmt.Sprintf(":%s 404 %s %s :Cannot send to channel", c.server.name, c.nick, args[0]) } }