chiark / gitweb /
correct address
[irc.git] / config.py
1 # This file is part of Acrobat.
2 #
3 # Acrobat is free software; you can redistribute it and/or modify
4 # it under the terms of the GNU General Public License as published
5 # by the Free Software Foundation; either version 2 of the License,
6 # or (at your option) any later version.
7 #
8 # Acrobat is distributed in the hope that it will be useful,
9 # but WITHOUT ANY WARRANTY; without even the implied warranty of
10 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
11 # GNU General Public License for more details.
12 #
13 # You should have received a copy of the GNU General Public License
14 # along with Acrobat; if not, write to the Free Software
15 # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307
16 # USA.
17
18 # Andrew Walkingshaw <andrew@lexical.org.uk>
19 # Peter Corbett <ptc24@cam.ac.uk>
20 # Matthew Vernon <matthew@debian.org>
21 # Stephen Early <steve@greenend.org.uk>
22
23 # Acrobat configuration file
24
25 # The following definitions are required to be present in this module:
26 server = "rapun"
27 port = 6667
28 nickname = "Testbot"
29 channel = "#test"
30 owner = "Emperor"
31 # Also a function called "command"; see later.
32
33 # Everything else in this file is configuration-specific.
34
35 # Most command implementations are stored in a separate module.
36 import commands as c
37
38 # This fishpond is shared between trouts and flirts.  It doesn't have to be;
39 # you can define as many ponds as you like.
40 class fish:
41         cur_fish=5
42         max_fish=5
43         nofish_time=60
44         fish_time_inc=60
45         fish_inc=2
46         DoS=0
47         Boring_Git='Nobody'
48         quotatime=0
49
50 # load a file full of flirts or trouts
51 def __load(filename):
52     try:
53         f = open(filename, "r")
54         r = [l.strip() for l in f.readlines() if l.find("%s") != -1]
55         f.close()
56     except IOError:
57         r = [ "doesn't know what to do about %s." ]
58     return r
59
60 # (troutlist,selftroutmsg,DoSmsg,notargetmsg,nofishmsg,fishpond,selftroutprob)
61 troutcfg = (
62         __load("trouts"),
63         __load("trouts-local"),
64         ' (at the instigation of %s)',
65         "Sorry, but %s is being a spoilsport.",
66         "Who do you wish me to trout?",
67         "Fish stocks exhausted.",
68         fish,
69         0.1)
70
71 flirtcfg = (
72         __load("flirts"),
73         ' (but %s is their secret admirer)',
74         "Sorry, but %s made me take Holy Orders.",
75         "Who do you wish me to flirt with?",
76         "My libido is over-used!",
77         fish,
78         0.1)
79
80 # Hacky command to output the current fishpond state
81 def fishq(bot, cmd, nick, conn, public,f):
82         from irclib import irc_lower
83         if not public and irc_lower(nick) == irc_lower(bot.owner):
84                 state=("Fishpond state: cur_fish=%d, max_fish=%d, nofish_time=%d, "
85                        +"fish_time_inc=%d, fish_inc=%d, DoS=%d, Boring_Git=%s, "
86                        +"quotatime=%d")%(f.cur_fish,f.max_fish,f.nofish_time,
87                                          f.fish_time_inc,f.fish_inc,f.DoS,f.Boring_Git,
88                                          f.quotatime)
89                 bot.automsg(public,nick,state)
90                                     
91 # Karma implementation
92 import cPickle
93 karmafilename = "karmadump"
94 # load the karma db
95 try:
96     f = open(karmafilename, "r")
97     karmadb = cPickle.load(f)
98     f.close()
99 except IOError:
100     karmadb = {}
101 # Modify karma
102 def karma(cmd, amount):
103     thing=cmd.split()[0][:-2].lower()
104     if karmadb.has_key(thing):
105         karmadb[thing] += amount
106     else:
107         karmadb[thing] = amount
108 def savekarma():
109     try:
110         f = open(karmafilename, "w")
111         cPickle.dump(karmadb, f)
112         f.close()
113     except IOError:
114         sys.stderr.write("Problems dumping karma: probably lost :(")
115
116 # When the bot exits we should save the karma db
117 def quit(bot,cmd,nick,conn,public):
118     savekarma()
119     c.quitq(bot,cmd,nick,conn,public)
120 def reload(bot,cmd,nick,conn,public):
121     savekarma()
122     c.reloadq(bot,cmd,nick,conn,public)
123
124 # Command processing: whenever something is said that the bot can hear,
125 # "command" is invoked and must decide what to do.  This configuration
126 # defines a couple of special cases (for karma) but is otherwise driven
127 # by a dictionary of commands.
128
129 commands = {"karma": (c.karmaq,karmadb),
130             "karmalist": (c.listkeysq,karmadb),
131             "karmadel": (c.karmadelq,karmadb),
132             "info": (c.infoq,karmadb),
133             "trout": (c.troutq,troutcfg),
134             "flirt": (c.troutq,flirtcfg),
135             "fish": (fishq,fish),
136             "quiet": (c.nofishq,fish),
137             "reload": reload,
138             "quit": quit,
139             "google": c.googleq,
140             "define": c.defineq,
141             "say": c.sayq,
142             "do": c.doq }
143 # disconnect and hop annoy people
144 #            "disconnect": c.disconnq,
145 #            "hop": c.disconnq }
146 commands["list"]=(c.listkeysq,commands)
147
148 triggers = ("!", "~") # what character should the bot be invoked by:
149                       # eg !trout, ~trout etc.
150
151 def command(bot, cmd, nick, conn, public):
152     ours=0
153     try:
154             if public and cmd[0] in triggers:
155                     ours=1
156                     cmd=cmd[1:]
157             if not public:
158                     ours=1
159             command = cmd.split()[0]
160     except IndexError:
161             command=""
162     # karma: up
163     if command.endswith("++"):
164         karma(cmd,1)
165     # karma: down
166     if command.endswith("--"):
167         karma(cmd,-1)
168
169     if ours and command.lower() in commands.keys():
170         e=commands[command]
171         if callable(e):
172             e(bot,cmd,nick,conn,public)
173         else:
174             e[0](bot,cmd,nick,conn,public,*e[1:])