- Timestamp:
- Feb 6, 2020, 3:03:07 PM (5 years ago)
- Location:
- trunk
- Files:
-
- 2 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/cmd/jounce/main.go
r9 r10 16 16 } 17 17 18 // TODO: load from config/DB 18 19 s := jounce.Server{ 19 20 Hostname: "localhost", 20 Logger: log.New(log.Writer(), "", log.LstdFlags), 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 }}, 21 28 } 22 29 23 30 log.Printf("Server listening on %v", addr) 31 go s.Run() 24 32 log.Fatal(s.Serve(ln)) 25 33 } -
trunk/server.go
r9 r10 2 2 3 3 import ( 4 "crypto/tls" 4 5 "fmt" 5 6 "io" … … 75 76 return c.WriteMessage(&irc.Message{ 76 77 Command: "PONG", 77 Params: []string{c.srv.Hostname},78 Params: []string{c.srv.Hostname}, 78 79 }) 79 80 default: … … 147 148 err = c.WriteMessage(&irc.Message{ 148 149 Command: irc.ERR_NOMOTD, 149 Params: []string{c.nick, "No MOTD"},150 Params: []string{c.nick, "No MOTD"}, 150 151 }) 151 152 if err != nil { … … 173 174 } 174 175 175 type Server struct{ 176 Hostname string 177 Logger Logger 176 type upstreamConn struct { 177 net net.Conn 178 irc *irc.Conn 179 srv *Server 180 } 181 182 type Upstream struct { 183 Addr string 184 Nick string 185 Username string 186 Realname string 187 } 188 189 type Server struct { 190 Hostname string 191 Logger Logger 192 Upstreams []Upstream // TODO: per-user 178 193 } 179 194 … … 194 209 return fmt.Errorf("failed to read IRC command: %v", err) 195 210 } 196 s.Logger.Print (msg)211 s.Logger.Printf("Downstream message: %v", msg) 197 212 198 213 err = c.handleMessage(msg) … … 214 229 } 215 230 231 func (s *Server) connect(upstream *Upstream) error { 232 s.Logger.Printf("Connecting to %v", upstream.Addr) 233 234 netConn, err := tls.Dial("tcp", upstream.Addr, nil) 235 if err != nil { 236 return fmt.Errorf("failed to dial %q: %v", upstream.Addr, err) 237 } 238 239 c := upstreamConn{net: netConn, irc: irc.NewConn(netConn), srv: s} 240 defer netConn.Close() 241 242 err = c.irc.WriteMessage(&irc.Message{ 243 Command: "NICK", 244 Params: []string{upstream.Nick}, 245 }) 246 if err != nil { 247 return err 248 } 249 250 err = c.irc.WriteMessage(&irc.Message{ 251 Command: "USER", 252 Params: []string{upstream.Username, "0", "*", upstream.Realname}, 253 }) 254 if err != nil { 255 return err 256 } 257 258 for { 259 msg, err := c.irc.ReadMessage() 260 if err == io.EOF { 261 break 262 } else if err != nil { 263 return fmt.Errorf("failed to read IRC command: %v", err) 264 } 265 log.Printf("Upstream message: %v", msg) 266 } 267 268 return netConn.Close() 269 } 270 271 func (s *Server) Run() { 272 for i := range s.Upstreams { 273 // TODO: retry connecting 274 go s.connect(&s.Upstreams[i]) 275 } 276 } 277 216 278 func (s *Server) Serve(ln net.Listener) error { 217 279 for {
Note:
See TracChangeset
for help on using the changeset viewer.