Changeset 55 in code for trunk/upstream.go
- Timestamp:
- Feb 17, 2020, 11:36:42 AM (5 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/upstream.go
r54 r55 57 57 58 58 msgs := make(chan *irc.Message, 64) 59 conn:= &upstreamConn{59 uc := &upstreamConn{ 60 60 upstream: upstream, 61 61 logger: logger, … … 71 71 go func() { 72 72 for msg := range msgs { 73 if err := conn.irc.WriteMessage(msg); err != nil {74 conn.logger.Printf("failed to write message: %v", err)75 } 76 } 77 if err := conn.net.Close(); err != nil {78 conn.logger.Printf("failed to close connection: %v", err)73 if err := uc.irc.WriteMessage(msg); err != nil { 74 uc.logger.Printf("failed to write message: %v", err) 75 } 76 } 77 if err := uc.net.Close(); err != nil { 78 uc.logger.Printf("failed to close connection: %v", err) 79 79 } else { 80 conn.logger.Printf("connection closed")80 uc.logger.Printf("connection closed") 81 81 } 82 82 }() 83 83 84 return conn, nil85 } 86 87 func ( c *upstreamConn) Close() error {88 if c.closed {84 return uc, nil 85 } 86 87 func (uc *upstreamConn) Close() error { 88 if uc.closed { 89 89 return fmt.Errorf("upstream connection already closed") 90 90 } 91 close( c.messages)92 c.closed = true91 close(uc.messages) 92 uc.closed = true 93 93 return nil 94 94 } 95 95 96 func ( c *upstreamConn) getChannel(name string) (*upstreamChannel, error) {97 ch, ok := c.channels[name]96 func (uc *upstreamConn) getChannel(name string) (*upstreamChannel, error) { 97 ch, ok := uc.channels[name] 98 98 if !ok { 99 99 return nil, fmt.Errorf("unknown channel %q", name) … … 102 102 } 103 103 104 func ( c *upstreamConn) handleMessage(msg *irc.Message) error {104 func (uc *upstreamConn) handleMessage(msg *irc.Message) error { 105 105 switch msg.Command { 106 106 case "PING": 107 107 // TODO: handle params 108 c.messages <- &irc.Message{108 uc.messages <- &irc.Message{ 109 109 Command: "PONG", 110 Params: []string{ c.srv.Hostname},110 Params: []string{uc.srv.Hostname}, 111 111 } 112 112 return nil … … 118 118 119 119 if name == msg.Prefix.Name { // user mode change 120 if name != c.nick {120 if name != uc.nick { 121 121 return fmt.Errorf("received MODE message for unknow nick %q", name) 122 122 } 123 return c.modes.Apply(modeStr)123 return uc.modes.Apply(modeStr) 124 124 } else { // channel mode change 125 ch, err := c.getChannel(name)125 ch, err := uc.getChannel(name) 126 126 if err != nil { 127 127 return err … … 132 132 } 133 133 134 c.user.forEachDownstream(func(dc *downstreamConn) {134 uc.user.forEachDownstream(func(dc *downstreamConn) { 135 135 dc.SendMessage(msg) 136 136 }) 137 137 case "NOTICE": 138 c.logger.Print(msg)138 uc.logger.Print(msg) 139 139 case irc.RPL_WELCOME: 140 c.registered = true141 c.logger.Printf("connection registered")142 143 for _, ch := range c.upstream.Channels {144 c.messages <- &irc.Message{140 uc.registered = true 141 uc.logger.Printf("connection registered") 142 143 for _, ch := range uc.upstream.Channels { 144 uc.messages <- &irc.Message{ 145 145 Command: "JOIN", 146 146 Params: []string{ch}, … … 148 148 } 149 149 case irc.RPL_MYINFO: 150 if err := parseMessageParams(msg, nil, & c.serverName, nil, &c.availableUserModes, &c.availableChannelModes); err != nil {150 if err := parseMessageParams(msg, nil, &uc.serverName, nil, &uc.availableUserModes, &uc.availableChannelModes); err != nil { 151 151 return err 152 152 } 153 153 if len(msg.Params) > 5 { 154 c.channelModesWithParam = msg.Params[5]154 uc.channelModesWithParam = msg.Params[5] 155 155 } 156 156 case "NICK": … … 160 160 } 161 161 162 if msg.Prefix.Name == c.nick {163 c.logger.Printf("changed nick from %q to %q",c.nick, newNick)164 c.nick = newNick165 } 166 167 for _, ch := range c.channels {162 if msg.Prefix.Name == uc.nick { 163 uc.logger.Printf("changed nick from %q to %q", uc.nick, newNick) 164 uc.nick = newNick 165 } 166 167 for _, ch := range uc.channels { 168 168 if membership, ok := ch.Members[msg.Prefix.Name]; ok { 169 169 delete(ch.Members, msg.Prefix.Name) … … 172 172 } 173 173 174 c.user.forEachDownstream(func(dc *downstreamConn) {174 uc.user.forEachDownstream(func(dc *downstreamConn) { 175 175 dc.SendMessage(msg) 176 176 }) … … 182 182 183 183 for _, ch := range strings.Split(channels, ",") { 184 if msg.Prefix.Name == c.nick {185 c.logger.Printf("joined channel %q", ch)186 c.channels[ch] = &upstreamChannel{184 if msg.Prefix.Name == uc.nick { 185 uc.logger.Printf("joined channel %q", ch) 186 uc.channels[ch] = &upstreamChannel{ 187 187 Name: ch, 188 conn: c,188 conn: uc, 189 189 Members: make(map[string]membership), 190 190 } 191 191 } else { 192 ch, err := c.getChannel(ch)192 ch, err := uc.getChannel(ch) 193 193 if err != nil { 194 194 return err … … 198 198 } 199 199 200 c.user.forEachDownstream(func(dc *downstreamConn) {200 uc.user.forEachDownstream(func(dc *downstreamConn) { 201 201 dc.SendMessage(msg) 202 202 }) … … 208 208 209 209 for _, ch := range strings.Split(channels, ",") { 210 if msg.Prefix.Name == c.nick {211 c.logger.Printf("parted channel %q", ch)212 delete( c.channels, ch)210 if msg.Prefix.Name == uc.nick { 211 uc.logger.Printf("parted channel %q", ch) 212 delete(uc.channels, ch) 213 213 } else { 214 ch, err := c.getChannel(ch)214 ch, err := uc.getChannel(ch) 215 215 if err != nil { 216 216 return err … … 220 220 } 221 221 222 c.user.forEachDownstream(func(dc *downstreamConn) {222 uc.user.forEachDownstream(func(dc *downstreamConn) { 223 223 dc.SendMessage(msg) 224 224 }) … … 228 228 return err 229 229 } 230 ch, err := c.getChannel(name)230 ch, err := uc.getChannel(name) 231 231 if err != nil { 232 232 return err … … 242 242 return err 243 243 } 244 ch, err := c.getChannel(name)244 ch, err := uc.getChannel(name) 245 245 if err != nil { 246 246 return err … … 256 256 return err 257 257 } 258 ch, err := c.getChannel(name)258 ch, err := uc.getChannel(name) 259 259 if err != nil { 260 260 return err … … 271 271 return err 272 272 } 273 ch, err := c.getChannel(name)273 ch, err := uc.getChannel(name) 274 274 if err != nil { 275 275 return err … … 291 291 return err 292 292 } 293 ch, err := c.getChannel(name)293 ch, err := uc.getChannel(name) 294 294 if err != nil { 295 295 return err … … 301 301 ch.complete = true 302 302 303 c.user.forEachDownstream(func(dc *downstreamConn) {303 uc.user.forEachDownstream(func(dc *downstreamConn) { 304 304 forwardChannel(dc, ch) 305 305 }) 306 306 case "PRIVMSG": 307 c.ring.Produce(msg)308 c.user.forEachDownstream(func(dc *downstreamConn) {307 uc.ring.Produce(msg) 308 uc.user.forEachDownstream(func(dc *downstreamConn) { 309 309 dc.SendMessage(msg) 310 310 }) … … 320 320 // Ignore 321 321 default: 322 c.logger.Printf("unhandled upstream message: %v", msg)322 uc.logger.Printf("unhandled upstream message: %v", msg) 323 323 } 324 324 return nil 325 325 } 326 326 327 func ( c *upstreamConn) register() {328 c.nick =c.upstream.Nick329 c.messages <- &irc.Message{327 func (uc *upstreamConn) register() { 328 uc.nick = uc.upstream.Nick 329 uc.messages <- &irc.Message{ 330 330 Command: "NICK", 331 Params: []string{ c.upstream.Nick},332 } 333 c.messages <- &irc.Message{331 Params: []string{uc.upstream.Nick}, 332 } 333 uc.messages <- &irc.Message{ 334 334 Command: "USER", 335 Params: []string{ c.upstream.Username, "0", "*",c.upstream.Realname},336 } 337 } 338 339 func ( c *upstreamConn) readMessages() error {335 Params: []string{uc.upstream.Username, "0", "*", uc.upstream.Realname}, 336 } 337 } 338 339 func (uc *upstreamConn) readMessages() error { 340 340 for { 341 msg, err := c.irc.ReadMessage()341 msg, err := uc.irc.ReadMessage() 342 342 if err == io.EOF { 343 343 break … … 346 346 } 347 347 348 if err := c.handleMessage(msg); err != nil {349 c.logger.Printf("failed to handle message %q: %v", msg, err)348 if err := uc.handleMessage(msg); err != nil { 349 uc.logger.Printf("failed to handle message %q: %v", msg, err) 350 350 } 351 351 }
Note:
See TracChangeset
for help on using the changeset viewer.