Changeset 37 in code
- Timestamp:
- Feb 7, 2020, 10:36:42 AM (5 years ago)
- Location:
- trunk
- Files:
-
- 4 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/cmd/jounce/main.go
r19 r37 16 16 } 17 17 18 srv := jounce.NewServer() 18 19 // TODO: load from config/DB 19 s := jounce.Server{ 20 Hostname: "localhost", 21 Logger: log.New(log.Writer(), "", log.LstdFlags), 22 Upstreams: []jounce.Upstream{{ 23 Addr: "chat.freenode.net:6697", 24 Nick: "jounce", 25 Username: "jounce", 26 Realname: "jounce", 27 Channels: []string{"#jounce"}, 28 }}, 29 } 20 srv.Hostname = "localhost" 21 srv.Upstreams = []jounce.Upstream{{ 22 Addr: "chat.freenode.net:6697", 23 Nick: "jounce", 24 Username: "jounce", 25 Realname: "jounce", 26 Channels: []string{"#jounce"}, 27 }} 30 28 31 29 log.Printf("Server listening on %v", addr) 32 go s .Run()33 log.Fatal(s .Serve(ln))30 go srv.Run() 31 log.Fatal(srv.Serve(ln)) 34 32 } -
trunk/downstream.go
r31 r37 47 47 48 48 registered bool 49 user *user 49 50 closed bool 50 51 nick string … … 167 168 168 169 func (c *downstreamConn) register() error { 170 c.srv.lock.Lock() 171 u, ok := c.srv.users[c.username] 172 c.srv.lock.Unlock() 173 174 if !ok { 175 c.messages <- &irc.Message{ 176 Prefix: c.srv.prefix(), 177 Command: irc.ERR_PASSWDMISMATCH, 178 Params: []string{"*", "Invalid username or password"}, 179 } 180 return nil 181 } 182 169 183 c.registered = true 184 c.user = u 170 185 171 186 c.messages <- &irc.Message{ … … 174 189 Params: []string{c.nick, "Welcome to jounce, " + c.nick}, 175 190 } 176 177 191 c.messages <- &irc.Message{ 178 192 Prefix: c.srv.prefix(), … … 180 194 Params: []string{c.nick, "Your host is " + c.srv.Hostname}, 181 195 } 182 183 196 c.messages <- &irc.Message{ 184 197 Prefix: c.srv.prefix(), … … 186 199 Params: []string{c.nick, "This server was created <datetime>"}, // TODO 187 200 } 188 189 201 c.messages <- &irc.Message{ 190 202 Prefix: c.srv.prefix(), … … 192 204 Params: []string{c.nick, c.srv.Hostname, "jounce", "aiwroO", "OovaimnqpsrtklbeI"}, 193 205 } 194 195 206 c.messages <- &irc.Message{ 196 207 Prefix: c.srv.prefix(), … … 199 210 } 200 211 201 c.srv.lock.Lock()202 for _, uc := range c.srv.upstreamConns {212 u.lock.Lock() 213 for _, uc := range u.upstreamConns { 203 214 // TODO: fix races accessing upstream connection data 204 215 if !uc.registered { … … 211 222 } 212 223 } 213 c.srv.lock.Unlock()224 u.lock.Unlock() 214 225 215 226 return nil -
trunk/server.go
r29 r37 3 3 import ( 4 4 "fmt" 5 "log" 5 6 "net" 6 7 "sync" … … 31 32 } 32 33 34 type user struct { 35 username string 36 srv *Server 37 38 lock sync.Mutex 39 upstreamConns []*upstreamConn 40 } 41 33 42 type Upstream struct { 34 43 Addr string … … 45 54 46 55 lock sync.Mutex 56 users map[string]*user 47 57 downstreamConns []*downstreamConn 48 upstreamConns []*upstreamConn 58 } 59 60 func NewServer() *Server { 61 return &Server{ 62 Logger: log.New(log.Writer(), "", log.LstdFlags), 63 users: make(map[string]*user), 64 } 49 65 } 50 66 … … 54 70 55 71 func (s *Server) Run() { 72 // TODO: multi-user 73 u := &user{username: "jounce", srv: s} 74 75 s.lock.Lock() 76 s.users[u.username] = u 77 s.lock.Unlock() 78 56 79 for i := range s.Upstreams { 57 80 upstream := &s.Upstreams[i] 58 81 // TODO: retry connecting 59 82 go func() { 60 conn, err := connectToUpstream( s, upstream)83 conn, err := connectToUpstream(u, upstream) 61 84 if err != nil { 62 85 s.Logger.Printf("failed to connect to upstream server %q: %v", upstream.Addr, err) … … 64 87 } 65 88 66 s.lock.Lock()67 s.upstreamConns = append(s.upstreamConns, conn)68 s.lock.Unlock()89 u.lock.Lock() 90 u.upstreamConns = append(u.upstreamConns, conn) 91 u.lock.Unlock() 69 92 70 93 if err := conn.readMessages(); err != nil { … … 72 95 } 73 96 74 s.lock.Lock()75 for i, c := range s.upstreamConns {97 u.lock.Lock() 98 for i, c := range u.upstreamConns { 76 99 if c == conn { 77 s.upstreamConns = append(s.upstreamConns[:i], s.upstreamConns[i+1:]...)100 u.upstreamConns = append(u.upstreamConns[:i], u.upstreamConns[i+1:]...) 78 101 break 79 102 } 80 103 } 81 s.lock.Unlock()104 u.lock.Unlock() 82 105 }() 83 106 } -
trunk/upstream.go
r36 r37 30 30 irc *irc.Conn 31 31 srv *Server 32 user *user 32 33 messages chan<- *irc.Message 33 34 … … 43 44 } 44 45 45 func connectToUpstream( s *Server, upstream *Upstream) (*upstreamConn, error) {46 logger := &prefixLogger{ s.Logger, fmt.Sprintf("upstream %q: ", upstream.Addr)}46 func connectToUpstream(u *user, upstream *Upstream) (*upstreamConn, error) { 47 logger := &prefixLogger{u.srv.Logger, fmt.Sprintf("upstream %q: ", upstream.Addr)} 47 48 logger.Printf("connecting to server") 48 49 … … 58 59 net: netConn, 59 60 irc: irc.NewConn(netConn), 60 srv: s, 61 srv: u.srv, 62 user: u, 61 63 messages: msgs, 62 64 channels: make(map[string]*upstreamChannel),
Note:
See TracChangeset
for help on using the changeset viewer.