source: code/trunk/service.go@ 144

Last change on this file since 144 was 120, checked in by delthas, 5 years ago

Add create-network bouncer service command

File size: 2.9 KB
Line 
1package soju
2
3import (
4 "flag"
5 "fmt"
6 "io/ioutil"
7 "strings"
8
9 "github.com/google/shlex"
10 "gopkg.in/irc.v3"
11)
12
13const serviceNick = "BouncerServ"
14
15type serviceCommand struct {
16 usage string
17 desc string
18 handle func(dc *downstreamConn, params []string) error
19}
20
21func sendServicePRIVMSG(dc *downstreamConn, text string) {
22 dc.SendMessage(&irc.Message{
23 Prefix: &irc.Prefix{Name: serviceNick},
24 Command: "PRIVMSG",
25 Params: []string{dc.nick, text},
26 })
27}
28
29func handleServicePRIVMSG(dc *downstreamConn, text string) {
30 words, err := shlex.Split(text)
31 if err != nil {
32 sendServicePRIVMSG(dc, fmt.Sprintf("error: failed to parse command: %v", err))
33 return
34 }
35
36 var name string
37 var params []string
38 if len(words) > 0 {
39 name = strings.ToLower(words[0])
40 params = words[1:]
41 }
42
43 cmd, ok := serviceCommands[name]
44 if !ok {
45 sendServicePRIVMSG(dc, fmt.Sprintf(`error: unknown command %q (type "help" for a list of commands)`, name))
46 return
47 }
48
49 if err := cmd.handle(dc, params); err != nil {
50 sendServicePRIVMSG(dc, fmt.Sprintf("error: %v", err))
51 }
52}
53
54var serviceCommands map[string]serviceCommand
55
56func init() {
57 serviceCommands = map[string]serviceCommand{
58 "help": {
59 usage: "[command]",
60 desc: "print help message",
61 handle: handleServiceHelp,
62 },
63 "create-network": {
64 usage: "-addr <addr> [-name name] [-username username] [-pass pass] [-realname realname] [-nick nick]",
65 desc: "add a new network",
66 handle: handleServiceCreateNetwork,
67 },
68 }
69}
70
71func handleServiceHelp(dc *downstreamConn, params []string) error {
72 if len(params) > 0 {
73 name := strings.ToLower(params[0])
74 cmd, ok := serviceCommands[name]
75 if !ok {
76 return fmt.Errorf("unknown command %q", name)
77 }
78
79 text := name
80 if cmd.usage != "" {
81 text += " " + cmd.usage
82 }
83 text += ": " + cmd.desc
84
85 sendServicePRIVMSG(dc, text)
86 } else {
87 var l []string
88 for name := range serviceCommands {
89 l = append(l, name)
90 }
91 sendServicePRIVMSG(dc, "available commands: "+strings.Join(l, ", "))
92 }
93 return nil
94}
95
96func handleServiceCreateNetwork(dc *downstreamConn, params []string) error {
97 fs := flag.NewFlagSet("", flag.ContinueOnError)
98 fs.SetOutput(ioutil.Discard)
99 addr := fs.String("addr", "", "")
100 name := fs.String("name", "", "")
101 username := fs.String("username", "", "")
102 pass := fs.String("pass", "", "")
103 realname := fs.String("realname", "", "")
104 nick := fs.String("nick", "", "")
105
106 if err := fs.Parse(params); err != nil {
107 return err
108 }
109 if *addr == "" {
110 return fmt.Errorf("flag addr is required")
111 }
112
113 if *nick == "" {
114 *nick = dc.nick
115 }
116
117 var err error
118 network, err := dc.user.createNetwork(&Network{
119 Addr: *addr,
120 Name: *name,
121 Username: *username,
122 Pass: *pass,
123 Realname: *realname,
124 Nick: *nick,
125 })
126 if err != nil {
127 return fmt.Errorf("could not create network: %v", err)
128 }
129
130 sendServicePRIVMSG(dc, fmt.Sprintf("created network %s successfully", network.GetName()))
131 return nil
132}
Note: See TracBrowser for help on using the repository browser.