source: code/trunk/upstream.go@ 13

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

Split downstram and upstream code into separate files

File size: 1.3 KB
Line 
1package jounce
2
3import (
4 "crypto/tls"
5 "fmt"
6 "io"
7 "net"
8
9 "gopkg.in/irc.v3"
10)
11
12type upstreamConn struct {
13 net net.Conn
14 irc *irc.Conn
15 srv *Server
16}
17
18func (c *upstreamConn) handleMessage(msg *irc.Message) error {
19 switch msg.Command {
20 case "PING":
21 // TODO: handle params
22 return c.irc.WriteMessage(&irc.Message{
23 Command: "PONG",
24 Params: []string{c.srv.Hostname},
25 })
26 default:
27 c.srv.Logger.Printf("Unhandled upstream message: %v", msg)
28 return nil
29 }
30}
31
32func connect(s *Server, upstream *Upstream) error {
33 s.Logger.Printf("Connecting to %v", upstream.Addr)
34
35 netConn, err := tls.Dial("tcp", upstream.Addr, nil)
36 if err != nil {
37 return fmt.Errorf("failed to dial %q: %v", upstream.Addr, err)
38 }
39
40 c := upstreamConn{net: netConn, irc: irc.NewConn(netConn), srv: s}
41 defer netConn.Close()
42
43 err = c.irc.WriteMessage(&irc.Message{
44 Command: "NICK",
45 Params: []string{upstream.Nick},
46 })
47 if err != nil {
48 return err
49 }
50
51 err = c.irc.WriteMessage(&irc.Message{
52 Command: "USER",
53 Params: []string{upstream.Username, "0", "*", upstream.Realname},
54 })
55 if err != nil {
56 return err
57 }
58
59 for {
60 msg, err := c.irc.ReadMessage()
61 if err == io.EOF {
62 break
63 } else if err != nil {
64 return fmt.Errorf("failed to read IRC command: %v", err)
65 }
66
67 if err := c.handleMessage(msg); err != nil {
68 return err
69 }
70 }
71
72 return netConn.Close()
73}
Note: See TracBrowser for help on using the repository browser.