1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
|
#!/usr/bin/env python3
import sys
if sys.version_info < (3, 6):
sys.stderr.write("BitBot requires python 3.6.0 or later\n")
sys.exit(1)
import argparse, faulthandler, os, platform, time
from src import Cache, Config, Database, EventManager, Exports, IRCBot
from src import Logging, ModuleManager, Timers, utils
faulthandler.enable()
directory = os.path.dirname(os.path.realpath(__file__))
arg_parser = argparse.ArgumentParser(
description="Python3 event-driven modular IRC bot")
arg_parser.add_argument("--version", "-v", action="store_true")
arg_parser.add_argument("--config", "-c",
help="Location of the JSON config file",
default=os.path.join(directory, "bot.conf"))
arg_parser.add_argument("--database", "-d",
help="Location of the sqlite3 database file",
default=os.path.join(directory, "databases", "bot.db"))
arg_parser.add_argument("--log-dir", "-l",
help="Location of the log directory",
default=os.path.join(directory, "logs"))
arg_parser.add_argument("--add-server", "-a",
help="Add a new server", action="store_true")
arg_parser.add_argument("--verbose", "-V", action="store_true")
arg_parser.add_argument("--log-level", "-L")
arg_parser.add_argument("--no-logging", "-N", action="store_true")
arg_parser.add_argument("--module", "-m",
help="Execute an action against a specific module")
arg_parser.add_argument("--module-args", "-M",
help="Arguments to give in action against a specific module")
args = arg_parser.parse_args()
if args.version:
print("BitBot %s" % IRCBot.VERSION)
sys.exit(0)
log_level = args.log_level
if not log_level:
log_level = "debug" if args.verbose else "info"
log = Logging.Log(not args.no_logging, log_level, args.log_dir)
log.info("Starting BitBot %s (Python v%s)",
[IRCBot.VERSION, platform.python_version()])
database = Database.Database(log, args.database)
if args.add_server:
print("Adding a new server")
utils.cli.add_server(database)
sys.exit(0)
cache = Cache.Cache()
config = Config.Config(args.config)
events = EventManager.EventRoot(log).wrap()
exports = Exports.Exports()
timers = Timers.Timers(database, events, log)
modules = ModuleManager.ModuleManager(events, exports, timers, config, log,
os.path.join(directory, "modules"))
bot = IRCBot.Bot(directory, args, cache, config, database, events,
exports, log, modules, timers)
if args.module:
definition = modules.find_module(args.module)
module = modules.load_module(bot, definition)
module.module.command_line(args.module_args)
sys.exit(0)
server_configs = bot.database.servers.get_all()
if len(server_configs):
bot.load_modules()
servers = []
for server_id, alias in server_configs:
server = bot.add_server(server_id, connect=False)
if not server == None and server.get_setting("connect", True):
server.from_init = True
servers.append(server)
bot._events.on("boot.done").call()
timers.setup(bot.find_settings_prefix("timer-"))
for server in servers:
if not bot.connect(server):
sys.stderr.write("failed to connect to '%s', exiting\r\n" % (
str(server)))
sys.exit(1)
try:
bot.run()
except Exception as e:
log.critical("Unhandled exception: %s", [str(e)], exc_info=True)
sys.exit(1)
else:
try:
if utils.cli.bool_input("no servers found, add one?"):
utils.cli.add_server(database)
except KeyboardInterrupt:
print()
pass
|