1 import irc, strutils, tables, threadpool
\r
2 import config, utils, master, buildsys
\r
5 BotCommandProc* = proc (irc: Irc, ev: IrcEvent, args: string)
\r
7 var botCommands*: Table[string, BotCommandProc]
\r
8 var memos = initTable[string, seq[tuple[s: string, m: string]]]()
\r
10 proc checkServerChanges*(irc: Irc) =
\r
11 if updateServerList():
\r
12 if serverListNewServer != "":
\r
13 serverList.withValue(serverListNewServer, s) do:
\r
14 irc.privmsg(ircChannel, "new server: '$1'" % [s.name])
\r
15 serverListNewServer = ""
\r
16 if serverListNewPlayer != "":
\r
17 serverList.withValue(serverListNewPlayer, s) do:
\r
18 irc.privmsg(ircChannel, "player joined '$1' ($2)" % [s.name, s.players])
\r
19 serverListNewPlayer = ""
\r
21 proc checkBuildFinished*(irc: Irc) =
\r
25 irc.privmsg(buildOrigin, "build finished. binaries available @ " & buildLink)
\r
27 irc.privmsg(buildOrigin, "build failed")
\r
28 buildFinished = false
\r
30 proc checkRebuildNeeded*(irc: Irc) =
\r
31 if not buildInProgress and shouldUpdate():
\r
32 irc.privmsg(ircChannel, "commit to $1 detected ($2), rebuilding" % [buildGitPath, lastCommitMsg])
\r
33 buildOrigin = ircChannel
\r
34 spawn attemptBuild()
\r
36 proc checkMemos*(irc: Irc, ev: IrcEvent) =
\r
37 if ev.nick in memos:
\r
38 for memo in memos[ev.nick]:
\r
40 irc.privmsg(ev.origin, "$1: message from $2: $3" % [ev.nick, s, m])
\r
43 proc cmdVersion(irc: Irc, ev: IrcEvent, args: string) =
\r
44 irc.privmsg(ev.origin, "#doom2d bot ver. " & botVersion & ", by fgsfds")
\r
46 proc cmdCommands(irc: Irc, ev: IrcEvent, args: string) =
\r
48 for k in botCommands.keys():
\r
50 irc.privmsg(ev.origin, "available commands:" & s)
\r
52 proc cmdServerlist(irc: Irc, ev: IrcEvent, args: string) =
\r
53 if not updateServerList():
\r
54 irc.privmsg(ev.origin, "couldn't fetch fresh list, using stored list.")
\r
55 if serverList.len == 0:
\r
56 irc.privmsg(ev.origin, "server list is empty.")
\r
58 var n = serverList.len
\r
59 irc.privmsg(ev.origin, "got $1 $2:" % [$n, "server".plural(n)])
\r
60 for v in serverList.values():
\r
61 irc.privmsg(ev.origin, $v)
\r
62 serverListNewPlayer = ""
\r
63 serverListNewServer = ""
\r
65 proc cmdBuild(irc: Irc, ev: IrcEvent, args: string) =
\r
67 irc.privmsg(ev.origin, "already building")
\r
69 getLastCommitMsg(true)
\r
70 irc.privmsg(ev.origin, "attempting to build d2df-sdl ($1)..." % [lastCommitMsg])
\r
71 buildOrigin = ev.origin
\r
72 spawn attemptBuild()
\r
74 proc cmdEcho(irc: Irc, ev: IrcEvent, args: string) =
\r
75 irc.privmsg(ev.origin, "$1: $2" % [ev.nick, args])
\r
77 proc cmdRoll(irc: Irc, ev: IrcEvent, args: string) =
\r
78 var nargs = args.strip()
\r
79 if nargs == "": nargs = "1d6"
\r
80 irc.privmsg(ev.origin, "$1: $2" % [ev.nick, diceResult(nargs)])
\r
82 proc cmdMemo(irc: Irc, ev: IrcEvent, args: string) =
\r
83 let argv = args.strip().splitWhitespace()
\r
85 irc.privmsg(ev.origin, "expected at least 2 words")
\r
87 let nick = argv[0].strip()
\r
89 irc.privmsg(ev.origin, "expected non-empty nick")
\r
92 memos[nick].add((ev.nick, argv[1 .. ^1].join(" ")))
\r
94 memos[nick] = @[(ev.nick, argv[1 .. ^1].join(" "))]
\r
95 irc.privmsg(ev.origin, "$1: message will be delivered to $2 when they say something" % [ev.nick, nick])
\r
97 botCommands = initTable[string, BotCommandProc](16)
\r
98 botCommands["version"] = cmdVersion
\r
99 botCommands["commands"] = cmdCommands
\r
100 botCommands["serverlist"] = cmdServerlist
\r
101 botCommands["build"] = cmdBuild
\r
102 botCommands["echo"] = cmdEcho
\r
103 botCommands["roll"] = cmdRoll
\r
104 botCommands["memo"] = cmdMemo
\r