Caught signals that would otherwise be fatal and saveless.
[halbot.git] / globals.py
blob8fe425709d0e0a871c58afcc58bc652a55941574
1 import atexit, bz2, cPickle, signal, sys, time
2 import threadsafe_sched, ircbot
3 import perms
5 DEBUG = False
6 nick = "Hal"
7 server = "localhost"
8 port = 6667
9 try:
10 pwfile = open('hal.pass')
11 password = pwfile.read().strip()
12 except Exception:
13 password = ""
14 autojoin_channels = ("#casualgameplay", "#hal")
15 kill_channels = {}
17 # Dummy where entry for privmsgs.
18 private = "p"
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()
26 commands = {}
28 from ircbot import IRCDict
29 my_users = 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()
36 unlower = {}
38 SAVE_VERSION = 6
39 from cPickle import dumps as pickle, loads as depickle
40 import perms
41 try:
42 db = open("hal.db")
43 zipped = db.read()
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
49 elif version == 5:
50 (my_users, factoid_dbs, locked_dbs, reminder_dbs, subscription_dbs, \
51 unlower, poke_via_msg, factoids_on) = data
52 else:
53 sys.exit("Unrecognized database version.")
54 db.close()
55 del db, zipped, pickled
56 except IOError:
57 pass
59 autosave_interval = 60*60*24 # 1 day.
60 next_save = time.time() + autosave_interval
61 def maybe_save():
62 if time.time() > next_save:
63 save()
65 def save(who=None, where=None, args=None):
66 global next_save
67 next_save = time.time() + autosave_interval
69 pickled = pickle((
70 SAVE_VERSION,
71 (my_users, factoid_dbs, locked_dbs, reminder_dbs,
72 subscription_dbs, unlower, poke_via_msg, factoids_on,
73 kill_channels)
75 zipped = bz2.compress(pickled)
76 db = open("hal.db", "w")
77 db.write(zipped)
78 db.close()
79 if who:
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.
84 atexit.register(save)
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)