source: code/trunk/upstream.go@ 14

Last change on this file since 14 was 14, checked in by contact, 5 years ago

Ignore some upstream messages

File size: 1.8 KB
RevLine 
[13]1package jounce
2
3import (
4 "crypto/tls"
5 "fmt"
6 "io"
7 "net"
8
9 "gopkg.in/irc.v3"
10)
11
[14]12const (
13 rpl_localusers = "265"
14 rpl_globalusers = "266"
15)
16
[13]17type upstreamConn struct {
18 net net.Conn
19 irc *irc.Conn
20 srv *Server
[14]21 registered bool
[13]22}
23
24func (c *upstreamConn) handleMessage(msg *irc.Message) error {
25 switch msg.Command {
26 case "PING":
27 // TODO: handle params
28 return c.irc.WriteMessage(&irc.Message{
29 Command: "PONG",
30 Params: []string{c.srv.Hostname},
31 })
[14]32 case irc.RPL_WELCOME:
33 c.registered = true
34 case irc.RPL_YOURHOST, irc.RPL_CREATED, irc.RPL_MYINFO:
35 // Ignore
36 case irc.RPL_LUSERCLIENT, irc.RPL_LUSEROP, irc.RPL_LUSERUNKNOWN, irc.RPL_LUSERCHANNELS, irc.RPL_LUSERME:
37 // Ignore
38 case irc.RPL_MOTDSTART, irc.RPL_MOTD, irc.RPL_ENDOFMOTD:
39 // Ignore
40 case rpl_localusers, rpl_globalusers:
41 // Ignore
42 case irc.RPL_STATSVLINE, irc.RPL_STATSPING, irc.RPL_STATSBLINE, irc.RPL_STATSDLINE:
43 // Ignore
[13]44 default:
45 c.srv.Logger.Printf("Unhandled upstream message: %v", msg)
46 }
[14]47 return nil
[13]48}
49
50func connect(s *Server, upstream *Upstream) error {
51 s.Logger.Printf("Connecting to %v", upstream.Addr)
52
53 netConn, err := tls.Dial("tcp", upstream.Addr, nil)
54 if err != nil {
55 return fmt.Errorf("failed to dial %q: %v", upstream.Addr, err)
56 }
57
58 c := upstreamConn{net: netConn, irc: irc.NewConn(netConn), srv: s}
59 defer netConn.Close()
60
61 err = c.irc.WriteMessage(&irc.Message{
62 Command: "NICK",
63 Params: []string{upstream.Nick},
64 })
65 if err != nil {
66 return err
67 }
68
69 err = c.irc.WriteMessage(&irc.Message{
70 Command: "USER",
71 Params: []string{upstream.Username, "0", "*", upstream.Realname},
72 })
73 if err != nil {
74 return err
75 }
76
77 for {
78 msg, err := c.irc.ReadMessage()
79 if err == io.EOF {
80 break
81 } else if err != nil {
82 return fmt.Errorf("failed to read IRC command: %v", err)
83 }
84
85 if err := c.handleMessage(msg); err != nil {
86 return err
87 }
88 }
89
90 return netConn.Close()
91}
Note: See TracBrowser for help on using the repository browser.