1 import atexit
, bz2
, cPickle
, signal
, sys
, time
2 import threadsafe_sched
, ircbot
10 pwfile
= open('hal.pass')
11 password
= pwfile
.read().strip()
14 autojoin_channels
= ("#casualgameplay", "#hal")
17 # Dummy where entry for privmsgs.
20 # For processing yes/no arguments.
21 yes
= ("1", "on", "true", "enable", "yes")
22 no
= ("0", "off", "true", "disable", "no")
24 scheduler
= threadsafe_sched
.scheduler()
28 from ircbot
import IRCDict
30 factoid_dbs
= IRCDict()
31 locked_dbs
= IRCDict()
32 factoids_on
= IRCDict()
33 reminder_dbs
= IRCDict()
34 subscription_dbs
= IRCDict()
35 poke_via_msg
= IRCDict()
39 from cPickle
import dumps
as pickle
, loads
as depickle
44 pickled
= bz2
.decompress(zipped
)
45 (version
, data
) = depickle(pickled
)
46 if version
== SAVE_VERSION
:
47 (my_users
, factoid_dbs
, locked_dbs
, reminder_dbs
, subscription_dbs
, \
48 unlower
, poke_via_msg
, factoids_on
, kill_channels
) = data
50 (my_users
, factoid_dbs
, locked_dbs
, reminder_dbs
, subscription_dbs
, \
51 unlower
, poke_via_msg
, factoids_on
) = data
53 sys
.exit("Unrecognized database version.")
55 del db
, zipped
, pickled
59 autosave_interval
= 60*60*24 # 1 day.
60 next_save
= time
.time() + autosave_interval
62 if time
.time() > next_save
:
65 def save(who
=None, where
=None, args
=None):
67 next_save
= time
.time() + autosave_interval
71 (my_users
, factoid_dbs
, locked_dbs
, reminder_dbs
,
72 subscription_dbs
, unlower
, poke_via_msg
, factoids_on
,
75 zipped
= bz2
.compress(pickled
)
76 db
= open("hal.db", "w")
80 from basic_commands
import reply
81 reply(who
, where
, "Database saved.")
83 # Try to save even when things go to hell in a handbasket.
85 signal
.signal(signal
.SIGTERM
, lambda signum
, stack_frame
: sys
.exit(0))
86 signal
.signal(signal
.SIGHUP
, lambda signum
, stack_frame
: None)
87 signal
.signal(signal
.SIGQUIT
, lambda signum
, stack_frame
: sys
.exit(0))
88 signal
.signal(signal
.SIGINT
, lambda signum
, stack_frame
: sys
.exit(0))
90 commands
['save'] = (perms
.ircop
, save
)