source: code/trunk/server.go@ 29

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

Keep track of upstream connections in a list

File size: 2.2 KB
RevLine 
[1]1package jounce
2
3import (
4 "fmt"
5 "net"
[24]6 "sync"
[1]7
8 "gopkg.in/irc.v3"
9)
10
[9]11type Logger interface {
12 Print(v ...interface{})
13 Printf(format string, v ...interface{})
14}
15
[21]16type prefixLogger struct {
17 logger Logger
18 prefix string
19}
20
21var _ Logger = (*prefixLogger)(nil)
22
23func (l *prefixLogger) Print(v ...interface{}) {
24 v = append([]interface{}{l.prefix}, v...)
25 l.logger.Print(v...)
26}
27
28func (l *prefixLogger) Printf(format string, v ...interface{}) {
29 v = append([]interface{}{l.prefix}, v...)
30 l.logger.Printf("%v"+format, v...)
31}
32
[10]33type Upstream struct {
34 Addr string
35 Nick string
36 Username string
37 Realname string
[19]38 Channels []string
[10]39}
40
41type Server struct {
42 Hostname string
43 Logger Logger
44 Upstreams []Upstream // TODO: per-user
[22]45
[24]46 lock sync.Mutex
[22]47 downstreamConns []*downstreamConn
[29]48 upstreamConns []*upstreamConn
[10]49}
50
[5]51func (s *Server) prefix() *irc.Prefix {
52 return &irc.Prefix{Name: s.Hostname}
53}
54
[10]55func (s *Server) Run() {
56 for i := range s.Upstreams {
[12]57 upstream := &s.Upstreams[i]
[10]58 // TODO: retry connecting
[12]59 go func() {
[23]60 conn, err := connectToUpstream(s, upstream)
61 if err != nil {
62 s.Logger.Printf("failed to connect to upstream server %q: %v", upstream.Addr, err)
63 return
[12]64 }
[29]65
66 s.lock.Lock()
67 s.upstreamConns = append(s.upstreamConns, conn)
68 s.lock.Unlock()
69
[23]70 if err := conn.readMessages(); err != nil {
71 conn.logger.Printf("failed to handle messages: %v", err)
72 }
[29]73
74 s.lock.Lock()
75 for i, c := range s.upstreamConns {
76 if c == conn {
77 s.upstreamConns = append(s.upstreamConns[:i], s.upstreamConns[i+1:]...)
78 break
79 }
80 }
81 s.lock.Unlock()
[12]82 }()
[10]83 }
84}
85
[3]86func (s *Server) Serve(ln net.Listener) error {
[1]87 for {
[22]88 netConn, err := ln.Accept()
[1]89 if err != nil {
90 return fmt.Errorf("failed to accept connection: %v", err)
91 }
92
[22]93 conn := newDownstreamConn(s, netConn)
[1]94 go func() {
[24]95 s.lock.Lock()
96 s.downstreamConns = append(s.downstreamConns, conn)
97 s.lock.Unlock()
[29]98
[22]99 if err := conn.readMessages(); err != nil {
[23]100 conn.logger.Printf("failed to handle messages: %v", err)
[1]101 }
[29]102
[24]103 s.lock.Lock()
104 for i, c := range s.downstreamConns {
105 if c == conn {
106 s.downstreamConns = append(s.downstreamConns[:i], s.downstreamConns[i+1:]...)
107 break
108 }
109 }
110 s.lock.Unlock()
[1]111 }()
112 }
113}
Note: See TracBrowser for help on using the repository browser.