Skip to content

Commit 9565adc

Browse files
committed
Refactor
1 parent 8d6d4b1 commit 9565adc

6 files changed

Lines changed: 87 additions & 66 deletions

File tree

cloudbot/__init__.py

Lines changed: 15 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22

33
# check python version
44
if sys.version_info < (3, 4, 0):
5-
print("CloudBot3 requires Python 3.4 or newer.")
5+
print("CloudBot requires Python 3.4 or newer.")
66
sys.exit(1)
77

88
import json
@@ -12,33 +12,25 @@
1212

1313
__version__ = "0.1.1.dev0"
1414

15-
__all__ = ["util", "bot", "connection", "config", "permissions", "plugin", "event", "hook", "dev_mode", "log_dir"]
15+
__all__ = ["util", "bot", "connection", "config", "permissions", "plugin", "event", "hook", "log_dir"]
1616

1717

1818
def _setup():
19-
default_developer_mode = {"plugin_reloading": False, "config_reloading": True,
20-
"console_debug": False, "file_debug": True}
2119
if os.path.exists(os.path.abspath("config.json")):
2220
with open(os.path.abspath("config.json")) as config_file:
2321
json_conf = json.load(config_file)
24-
developer_mode = json_conf.get("developer_mode", default_developer_mode)
22+
logging_config = json_conf.get("logging", {})
2523
else:
26-
developer_mode = default_developer_mode
24+
logging_config = {}
2725

28-
if "config_reloading" not in developer_mode:
29-
developer_mode["config_reloading"] = default_developer_mode["config_reloading"]
30-
if "plugin_reloading" not in developer_mode:
31-
developer_mode["plugin_reloading"] = default_developer_mode["plugin_reloading"]
32-
if "console_debug" not in developer_mode:
33-
developer_mode["console_debug"] = default_developer_mode["console_debug"]
34-
if "file_debug" not in developer_mode:
35-
developer_mode["file_debug"] = default_developer_mode["file_debug"]
26+
console_debug = logging_config.get("console_debug", False)
27+
file_debug = logging_config.get("file_debug", True)
3628

37-
global log_dir
38-
log_dir = os.path.join(os.path.abspath(os.path.curdir), "logs")
29+
global logging_dir
30+
logging_dir = os.path.join(os.path.abspath(os.path.curdir), "logs")
3931

40-
if not os.path.exists(log_dir):
41-
os.makedirs(log_dir)
32+
if not os.path.exists(logging_dir):
33+
os.makedirs(logging_dir)
4234

4335
dict_config = {
4436
"version": 1,
@@ -66,7 +58,7 @@ def _setup():
6658
"formatter": "full",
6759
"level": "INFO",
6860
"encoding": "utf-8",
69-
"filename": os.path.join(log_dir, "bot.log")
61+
"filename": os.path.join(logging_dir, "bot.log")
7062
}
7163
},
7264
"loggers": {
@@ -77,24 +69,21 @@ def _setup():
7769
}
7870
}
7971

80-
if developer_mode["console_debug"]:
72+
if console_debug:
8173
dict_config["handlers"]["console"]["level"] = "DEBUG"
8274

83-
if developer_mode["file_debug"]:
75+
if file_debug:
8476
dict_config["handlers"]["debug_file"] = {
8577
"class": "logging.handlers.RotatingFileHandler",
8678
"maxBytes": 1000000,
8779
"backupCount": 5,
8880
"formatter": "full",
8981
"encoding": "utf-8",
9082
"level": "DEBUG",
91-
"filename": os.path.join(log_dir, "debug.log")
83+
"filename": os.path.join(logging_dir, "debug.log")
9284
}
9385
dict_config["loggers"]["cloudbot"]["handlers"].append("debug_file")
9486

9587
logging.config.dictConfig(dict_config)
9688

97-
return developer_mode
98-
99-
100-
dev_mode = _setup()
89+
_setup()

cloudbot/__main__.py

Lines changed: 14 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -5,21 +5,16 @@
55
import time
66
import signal
77

8-
print('CloudBot3 <http://git.io/refresh>')
8+
# store the original working directory, for use when restarting
9+
original_wd = os.path.realpath(".")
910

10-
# set up environment
11-
12-
# we need to make sure we are in the install directory
11+
# set up environment - we need to make sure we are in the install directory
1312
path0 = os.path.realpath(sys.path[0] or '.')
14-
cloudbot_dir = os.path.realpath(os.path.dirname(__file__))
15-
if path0 == cloudbot_dir:
16-
sys.path[0] = path0 = os.path.dirname(cloudbot_dir)
13+
install_dir = os.path.realpath(os.path.dirname(__file__))
14+
if path0 == install_dir:
15+
sys.path[0] = path0 = os.path.dirname(install_dir)
1716
os.chdir(path0)
1817

19-
# add 'lib' to path for libraries (currently unused)
20-
if os.path.exists(os.path.abspath('lib')):
21-
sys.path += ['lib']
22-
2318
# import bot
2419
from cloudbot.bot import CloudBot
2520

@@ -31,12 +26,10 @@ def main():
3126
logging.logProcesses = 0
3227

3328
logger = logging.getLogger("cloudbot")
34-
35-
# store the original working directory, for use when restarting
36-
original_wd = os.path.realpath(".")
29+
logger.info("Starting CloudBot.")
3730

3831
# create the bot
39-
cloudbot = CloudBot()
32+
bot = CloudBot()
4033

4134
# whether we are killed while restarting
4235
stopped_while_restarting = False
@@ -47,11 +40,11 @@ def main():
4740
# define closure for signal handling
4841
def exit_gracefully(signum, frame):
4942
nonlocal stopped_while_restarting
50-
if not cloudbot:
43+
if not bot:
5144
# we are currently in the process of restarting
5245
stopped_while_restarting = True
5346
else:
54-
cloudbot.loop.call_soon_threadsafe(lambda: asyncio.async(cloudbot.stop("Killed"), loop=cloudbot.loop))
47+
bot.loop.call_soon_threadsafe(lambda: asyncio.async(bot.stop("Killed"), loop=bot.loop))
5548

5649
# restore the original handler so if they do it again it triggers
5750
signal.signal(signal.SIGINT, original_sigint)
@@ -61,12 +54,12 @@ def exit_gracefully(signum, frame):
6154
# start the bot master
6255

6356
# CloudBot.run() will return True if it should restart, False otherwise
64-
restart = cloudbot.run()
57+
restart = bot.run()
6558

6659
# the bot has stopped, do we want to restart?
6760
if restart:
6861
# remove reference to cloudbot, so exit_gracefully won't try to stop it
69-
cloudbot = None
62+
bot = None
7063
# sleep one second for timeouts
7164
time.sleep(1)
7265
if stopped_while_restarting:
@@ -75,8 +68,8 @@ def exit_gracefully(signum, frame):
7568
# actually restart
7669
os.chdir(original_wd)
7770
args = sys.argv
78-
logger.info("Restarting CloudBot")
79-
logger.debug("Restarting - arguments {}".format(args))
71+
logger.info("Restarting Bot")
72+
logger.debug("Restart arguments: {}".format(args))
8073
for f in [sys.stdout, sys.stderr]:
8174
f.flush()
8275
# close logging, and exit the program.

cloudbot/bot.py

Lines changed: 8 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -71,15 +71,9 @@ def __init__(self, loop=asyncio.get_event_loop()):
7171
self.config = Config(self)
7272
logger.debug("Config system initialised.")
7373

74-
# log developer mode
75-
if cloudbot.dev_mode.get("plugin_reloading"):
76-
logger.info("Enabling developer option: plugin reloading.")
77-
if cloudbot.dev_mode.get("config_reloading"):
78-
logger.info("Enabling developer option: config reloading.")
79-
if cloudbot.dev_mode.get("console_debug"):
80-
logger.info("Enabling developer option: console debug.")
81-
if cloudbot.dev_mode.get("file_debug"):
82-
logger.info("Enabling developer option: file debug")
74+
# set values for reloading
75+
self.plugin_reloading_enabled = self.config.get("reloading", {}).get("plugin_reloading", False)
76+
self.config_reloading_enabled = self.config.get("reloading", {}).get("config_reloading", True)
8377

8478
# this doesn't REALLY need to be here but it's nice
8579
self.user_agent = self.config.get('user_agent', 'CloudBot/3.0 - CloudBot Refresh '
@@ -91,6 +85,7 @@ def __init__(self, loop=asyncio.get_event_loop()):
9185
self.db_factory = sessionmaker(bind=self.db_engine)
9286
self.db_session = scoped_session(self.db_factory)
9387
self.db_metadata = MetaData()
88+
9489
# set botvars.metadata so plugins can access when loading
9590
botvars.metadata = self.db_metadata
9691
logger.debug("Database system initialised.")
@@ -101,7 +96,7 @@ def __init__(self, loop=asyncio.get_event_loop()):
10196
# create bot connections
10297
self.create_connections()
10398

104-
if cloudbot.dev_mode.get("plugin_reloading"):
99+
if self.plugin_reloading_enabled:
105100
self.reloader = PluginReloader(self)
106101

107102
self.plugin_manager = PluginManager(self)
@@ -143,11 +138,11 @@ def stop(self, reason=None, *, restart=False):
143138
"""quits all networks and shuts the bot down"""
144139
logger.info("Stopping bot.")
145140

146-
if cloudbot.dev_mode.get("config_reloading"):
141+
if self.config_reloading_enabled:
147142
logger.debug("Stopping config reloader.")
148143
self.config.stop()
149144

150-
if cloudbot.dev_mode.get("plugin_reloading"):
145+
if self.plugin_reloading_enabled:
151146
logger.debug("Stopping plugin reloader.")
152147
self.reloader.stop()
153148

@@ -186,7 +181,7 @@ def _init_routine(self):
186181
logger.info("Killed while loading, exiting")
187182
return
188183

189-
if cloudbot.dev_mode.get("plugin_reloading"):
184+
if self.plugin_reloading_enabled:
190185
# start plugin reloader
191186
self.reloader.start(os.path.abspath("plugins"))
192187

cloudbot/config.py

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -35,8 +35,9 @@ def __init__(self, bot, *args, **kwargs):
3535

3636
# populate self with config data
3737
self.load_config()
38+
self.reloading_enabled = self.get("reloading", {}).get("config_reloading", True)
3839

39-
if cloudbot.dev_mode["config_reloading"]:
40+
if self.reloading_enabled:
4041
# start watcher
4142
self.observer = Observer()
4243

@@ -48,7 +49,7 @@ def __init__(self, bot, *args, **kwargs):
4849

4950
def stop(self):
5051
"""shuts down the config reloader"""
51-
if cloudbot.dev_mode["config_reloading"]:
52+
if self.reloading_enabled:
5253
self.observer.stop()
5354

5455
def load_config(self):

cloudbot/util/dictionaries.py

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
class CaseInsensitiveDict(dict):
2+
"""
3+
dict() -> new empty dictionary
4+
dict(mapping) -> new dictionary initialized from a mapping object's
5+
(key, value) pairs
6+
dict(iterable) -> new dictionary initialized as if via:
7+
d = {}
8+
for k, v in iterable:
9+
d[k] = v
10+
dict(**kwargs) -> new dictionary initialized with the name=value pairs
11+
in the keyword argument list. For example: dict(one=1, two=2)
12+
"""
13+
14+
def get(self, k, d=None): # real signature unknown; restored from __doc__
15+
""" D.get(k[,d]) -> D[k] if k in D, else d. d defaults to None. """
16+
return super().get(k.lower() if k is not None else k, d)
17+
18+
def pop(self, k, d=None): # real signature unknown; restored from __doc__
19+
"""
20+
D.pop(k[,d]) -> v, remove specified key and return the corresponding value.
21+
If key is not found, d is returned if given, otherwise KeyError is raised
22+
"""
23+
return super().pop(k.lower() if k is not None else k, d)
24+
25+
def setdefault(self, k, d=None): # real signature unknown; restored from __doc__
26+
""" D.setdefault(k[,d]) -> D.get(k,d), also set D[k]=d if k not in D """
27+
return super().setdefault(k.lower() if k is not None else k, d)
28+
29+
def __contains__(self, k): # real signature unknown
30+
""" True if D has a key k, else False. """
31+
return super().__contains__(k.lower() if k is not None else k)
32+
33+
def __delitem__(self, k): # real signature unknown
34+
""" Delete self[key]. """
35+
return super().__delitem__(k.lower() if k is not None else k)
36+
37+
def __getitem__(self, k): # real signature unknown; restored from __doc__
38+
""" x.__getitem__(y) <==> x[y] """
39+
return super().__getitem__(k.lower() if k is not None else k)
40+
41+
def __setitem__(self, k, v): # real signature unknown
42+
""" Set self[key] to value. """
43+
return super().__setitem__(k.lower() if k is not None else k, v)

config.default.json

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -89,13 +89,13 @@
8989
],
9090
"whitelist": []
9191
},
92-
"developer_mode": {
92+
"reloading": {
9393
"config_reloading": true,
94-
"plugin_reloading": false,
95-
"console_debug": false,
96-
"file_debug": true
94+
"plugin_reloading": false
9795
},
9896
"logging": {
97+
"console_debug": false,
98+
"file_debug": true,
9999
"show_plugin_loading": true,
100100
"show_motd": true,
101101
"show_server_info": true,

0 commit comments

Comments
 (0)