Changeset 10 in code for trunk


Ignore:
Timestamp:
Feb 6, 2020, 3:03:07 PM (5 years ago)
Author:
contact
Message:

Connect to upstream servers

Location:
trunk
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • trunk/cmd/jounce/main.go

    r9 r10  
    1616        }
    1717
     18        // TODO: load from config/DB
    1819        s := jounce.Server{
    1920                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                }},
    2128        }
    2229
    2330        log.Printf("Server listening on %v", addr)
     31        go s.Run()
    2432        log.Fatal(s.Serve(ln))
    2533}
  • trunk/server.go

    r9 r10  
    22
    33import (
     4        "crypto/tls"
    45        "fmt"
    56        "io"
     
    7576                return c.WriteMessage(&irc.Message{
    7677                        Command: "PONG",
    77                         Params: []string{c.srv.Hostname},
     78                        Params:  []string{c.srv.Hostname},
    7879                })
    7980        default:
     
    147148        err = c.WriteMessage(&irc.Message{
    148149                Command: irc.ERR_NOMOTD,
    149                 Params: []string{c.nick, "No MOTD"},
     150                Params:  []string{c.nick, "No MOTD"},
    150151        })
    151152        if err != nil {
     
    173174}
    174175
    175 type Server struct{
    176         Hostname string
    177         Logger   Logger
     176type upstreamConn struct {
     177        net net.Conn
     178        irc *irc.Conn
     179        srv *Server
     180}
     181
     182type Upstream struct {
     183        Addr     string
     184        Nick     string
     185        Username string
     186        Realname string
     187}
     188
     189type Server struct {
     190        Hostname  string
     191        Logger    Logger
     192        Upstreams []Upstream // TODO: per-user
    178193}
    179194
     
    194209                        return fmt.Errorf("failed to read IRC command: %v", err)
    195210                }
    196                 s.Logger.Print(msg)
     211                s.Logger.Printf("Downstream message: %v", msg)
    197212
    198213                err = c.handleMessage(msg)
     
    214229}
    215230
     231func (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
     271func (s *Server) Run() {
     272        for i := range s.Upstreams {
     273                // TODO: retry connecting
     274                go s.connect(&s.Upstreams[i])
     275        }
     276}
     277
    216278func (s *Server) Serve(ln net.Listener) error {
    217279        for {
Note: See TracChangeset for help on using the changeset viewer.