Changeset 165 in code for trunk/user.go


Ignore:
Timestamp:
Mar 27, 2020, 3:33:19 PM (5 years ago)
Author:
contact
Message:

Introduce a user.events channel

This allows to easily add new events, and also guarantees ordering
between different event types.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/user.go

    r144 r165  
    88)
    99
    10 type upstreamIncomingMessage struct {
     10type event interface{}
     11
     12type eventUpstreamMessage struct {
    1113        msg *irc.Message
    1214        uc  *upstreamConn
    1315}
    1416
    15 type downstreamIncomingMessage struct {
     17type eventDownstreamMessage struct {
    1618        msg *irc.Message
    1719        dc  *downstreamConn
     
    5961                net.lock.Unlock()
    6062
    61                 if err := uc.readMessages(net.user.upstreamIncoming); err != nil {
     63                if err := uc.readMessages(net.user.events); err != nil {
    6264                        uc.logger.Printf("failed to handle messages: %v", err)
    6365                }
     
    8082        srv *Server
    8183
    82         upstreamIncoming   chan upstreamIncomingMessage
    83         downstreamIncoming chan downstreamIncomingMessage
     84        events chan event
    8485
    8586        lock            sync.Mutex
     
    9091func newUser(srv *Server, record *User) *user {
    9192        return &user{
    92                 User:               *record,
    93                 srv:                srv,
    94                 upstreamIncoming:   make(chan upstreamIncomingMessage, 64),
    95                 downstreamIncoming: make(chan downstreamIncomingMessage, 64),
     93                User:   *record,
     94                srv:    srv,
     95                events: make(chan event, 64),
    9696        }
    9797}
     
    150150        u.lock.Unlock()
    151151
    152         for {
    153                 select {
    154                 case upstreamMsg := <-u.upstreamIncoming:
    155                         msg, uc := upstreamMsg.msg, upstreamMsg.uc
     152        for e := range u.events {
     153                switch e := e.(type) {
     154                case eventUpstreamMessage:
     155                        msg, uc := e.msg, e.uc
    156156                        if uc.closed {
    157157                                uc.logger.Printf("ignoring message on closed connection: %v", msg)
     
    161161                                uc.logger.Printf("failed to handle message %q: %v", msg, err)
    162162                        }
    163                 case downstreamMsg := <-u.downstreamIncoming:
    164                         msg, dc := downstreamMsg.msg, downstreamMsg.dc
     163                case eventDownstreamMessage:
     164                        msg, dc := e.msg, e.dc
    165165                        if dc.isClosed() {
    166166                                dc.logger.Printf("ignoring message on closed connection: %v", msg)
     
    175175                                dc.Close()
    176176                        }
     177                default:
     178                        u.srv.Logger.Printf("received unknown event type: %T", e)
    177179                }
    178180        }
Note: See TracChangeset for help on using the changeset viewer.