source: code/trunk/service.go@ 118

Last change on this file since 118 was 117, checked in by contact, 5 years ago

Add basic infrastructure for bouncer service

File size: 1.8 KB
Line 
1package soju
2
3import (
4 "fmt"
5 "strings"
6
7 "github.com/google/shlex"
8 "gopkg.in/irc.v3"
9)
10
11const serviceNick = "BouncerServ"
12
13type serviceCommand struct {
14 usage string
15 desc string
16 handle func(dc *downstreamConn, params []string) error
17}
18
19func sendServicePRIVMSG(dc *downstreamConn, text string) {
20 dc.SendMessage(&irc.Message{
21 Prefix: &irc.Prefix{Name: serviceNick},
22 Command: "PRIVMSG",
23 Params: []string{dc.nick, text},
24 })
25}
26
27func handleServicePRIVMSG(dc *downstreamConn, text string) {
28 words, err := shlex.Split(text)
29 if err != nil {
30 sendServicePRIVMSG(dc, fmt.Sprintf("error: failed to parse command: %v", err))
31 return
32 }
33
34 var name string
35 var params []string
36 if len(words) > 0 {
37 name = strings.ToLower(words[0])
38 params = words[1:]
39 }
40
41 cmd, ok := serviceCommands[name]
42 if !ok {
43 sendServicePRIVMSG(dc, fmt.Sprintf(`error: unknown command %q (type "help" for a list of commands)`, name))
44 return
45 }
46
47 if err := cmd.handle(dc, params); err != nil {
48 sendServicePRIVMSG(dc, fmt.Sprintf("error: %v", err))
49 }
50}
51
52var serviceCommands map[string]serviceCommand
53
54func init() {
55 serviceCommands = map[string]serviceCommand{
56 "help": {
57 usage: "[command]",
58 desc: "print help message",
59 handle: handleServiceHelp,
60 },
61 }
62}
63
64func handleServiceHelp(dc *downstreamConn, params []string) error {
65 if len(params) > 0 {
66 name := strings.ToLower(params[0])
67 cmd, ok := serviceCommands[name]
68 if !ok {
69 return fmt.Errorf("unknown command %q", name)
70 }
71
72 text := name
73 if cmd.usage != "" {
74 text += " " + cmd.usage
75 }
76 text += ": " + cmd.desc
77
78 sendServicePRIVMSG(dc, text)
79 } else {
80 var l []string
81 for name := range serviceCommands {
82 l = append(l, name)
83 }
84 sendServicePRIVMSG(dc, "available commands: "+strings.Join(l, ", "))
85 }
86 return nil
87}
Note: See TracBrowser for help on using the repository browser.