Changeset 263 in code for trunk


Ignore:
Timestamp:
Apr 16, 2020, 3:38:47 PM (5 years ago)
Author:
delthas
Message:

Add support for custom network on-connect commands

Some servers use custom IRC bots with custom commands for registering to
specific services after connection.

This adds support for setting custom raw IRC messages, that will be
sent after registering to a network.

It also adds support for a custom flag.Value type for string
slice flags (flags taking several string values).

Location:
trunk
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • trunk/db.go

    r255 r263  
    44        "database/sql"
    55        "fmt"
     6        "strings"
    67        "sync"
    78
     
    2425
    2526type Network struct {
    26         ID       int64
    27         Name     string
    28         Addr     string
    29         Nick     string
    30         Username string
    31         Realname string
    32         Pass     string
    33         SASL     SASL
     27        ID              int64
     28        Name            string
     29        Addr            string
     30        Nick            string
     31        Username        string
     32        Realname        string
     33        Pass            string
     34        ConnectCommands []string
     35        SASL            SASL
    3436}
    3537
     
    6466        realname VARCHAR(255),
    6567        pass VARCHAR(255),
     68        connect_commands VARCHAR(1023),
    6669        sasl_mechanism VARCHAR(255),
    6770        sasl_plain_username VARCHAR(255),
     
    8386var migrations = []string{
    8487        "", // migration #0 is reserved for schema initialization
     88        "ALTER TABLE Network ADD COLUMN connect_commands VARCHAR(1023)",
    8589}
    8690
     
    234238
    235239        rows, err := db.db.Query(`SELECT id, name, addr, nick, username, realname, pass,
    236                         sasl_mechanism, sasl_plain_username, sasl_plain_password
     240                        connect_commands, sasl_mechanism, sasl_plain_username, sasl_plain_password
    237241                FROM Network
    238242                WHERE user = ?`,
     
    246250        for rows.Next() {
    247251                var net Network
    248                 var name, username, realname, pass *string
     252                var name, username, realname, pass, connectCommands *string
    249253                var saslMechanism, saslPlainUsername, saslPlainPassword *string
    250254                err := rows.Scan(&net.ID, &name, &net.Addr, &net.Nick, &username, &realname,
    251                         &pass, &saslMechanism, &saslPlainUsername, &saslPlainPassword)
     255                        &pass, &connectCommands, &saslMechanism, &saslPlainUsername, &saslPlainPassword)
    252256                if err != nil {
    253257                        return nil, err
     
    257261                net.Realname = fromStringPtr(realname)
    258262                net.Pass = fromStringPtr(pass)
     263                if connectCommands != nil {
     264                        net.ConnectCommands = strings.Split(*connectCommands, "\r\n")
     265                }
    259266                net.SASL.Mechanism = fromStringPtr(saslMechanism)
    260267                net.SASL.Plain.Username = fromStringPtr(saslPlainUsername)
     
    277284        realname := toStringPtr(network.Realname)
    278285        pass := toStringPtr(network.Pass)
     286        connectCommands := toStringPtr(strings.Join(network.ConnectCommands, "\r\n"))
    279287
    280288        var saslMechanism, saslPlainUsername, saslPlainPassword *string
     
    293301        if network.ID != 0 {
    294302                _, err = db.db.Exec(`UPDATE Network
    295                         SET name = ?, addr = ?, nick = ?, username = ?, realname = ?, pass = ?,
     303                        SET name = ?, addr = ?, nick = ?, username = ?, realname = ?, pass = ?, connect_commands = ?,
    296304                                sasl_mechanism = ?, sasl_plain_username = ?, sasl_plain_password = ?
    297305                        WHERE id = ?`,
    298                         netName, network.Addr, network.Nick, netUsername, realname, pass,
     306                        netName, network.Addr, network.Nick, netUsername, realname, pass, connectCommands,
    299307                        saslMechanism, saslPlainUsername, saslPlainPassword, network.ID)
    300308        } else {
    301309                var res sql.Result
    302310                res, err = db.db.Exec(`INSERT INTO Network(user, name, addr, nick, username,
    303                                 realname, pass, sasl_mechanism, sasl_plain_username,
     311                                realname, pass, connect_commands, sasl_mechanism, sasl_plain_username,
    304312                                sasl_plain_password)
    305                         VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`,
    306                         username, netName, network.Addr, network.Nick, netUsername, realname, pass,
     313                        VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`,
     314                        username, netName, network.Addr, network.Nick, netUsername, realname, pass, connectCommands,
    307315                        saslMechanism, saslPlainUsername, saslPlainPassword)
    308316                if err != nil {
  • trunk/service.go

    r252 r263  
    105105                        children: serviceCommandSet{
    106106                                "create": {
    107                                         usage:  "-addr <addr> [-name name] [-username username] [-pass pass] [-realname realname] [-nick nick]",
     107                                        usage:  "-addr <addr> [-name name] [-username username] [-pass pass] [-realname realname] [-nick nick] [[-connect-command command] ...]",
    108108                                        desc:   "add a new network",
    109109                                        handle: handleServiceCreateNetwork,
     
    175175}
    176176
     177type stringSliceVar []string
     178
     179func (v *stringSliceVar) String() string {
     180        return fmt.Sprint([]string(*v))
     181}
     182
     183func (v *stringSliceVar) Set(s string) error {
     184        *v = append(*v, s)
     185        return nil
     186}
     187
    177188func handleServiceCreateNetwork(dc *downstreamConn, params []string) error {
    178189        fs := newFlagSet()
     
    183194        realname := fs.String("realname", "", "")
    184195        nick := fs.String("nick", "", "")
     196        var connectCommands stringSliceVar
     197        fs.Var(&connectCommands, "connect-command", "")
    185198
    186199        if err := fs.Parse(params); err != nil {
     
    191204        }
    192205
     206        for _, command := range connectCommands {
     207                _, err := irc.ParseMessage(command)
     208                if err != nil {
     209                        return fmt.Errorf("flag -connect-command must be a valid raw irc command string: %q: %v", command, err)
     210                }
     211        }
     212
    193213        if *nick == "" {
    194214                *nick = dc.nick
     
    197217        var err error
    198218        network, err := dc.user.createNetwork(&Network{
    199                 Addr:     *addr,
    200                 Name:     *name,
    201                 Username: *username,
    202                 Pass:     *pass,
    203                 Realname: *realname,
    204                 Nick:     *nick,
     219                Addr:            *addr,
     220                Name:            *name,
     221                Username:        *username,
     222                Pass:            *pass,
     223                Realname:        *realname,
     224                Nick:            *nick,
     225                ConnectCommands: connectCommands,
    205226        })
    206227        if err != nil {
  • trunk/upstream.go

    r261 r263  
    11901190        }
    11911191
     1192        for _, command := range uc.network.ConnectCommands {
     1193                m, err := irc.ParseMessage(command)
     1194                if err != nil {
     1195                        uc.logger.Printf("failed to parse connect command %q: %v", command, err)
     1196                } else {
     1197                        uc.SendMessage(m)
     1198                }
     1199        }
     1200
    11921201        return nil
    11931202}
Note: See TracChangeset for help on using the changeset viewer.