aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorGravatar Gareth Coles <[email protected]>2018-02-12 18:45:40 +0000
committerGravatar Gareth Coles <[email protected]>2018-02-12 18:45:40 +0000
commit59693c1f71fe8a71d562e1506ae252fc4a5d1b5c (patch)
tree1ef079eb271d3e5620e2b687329370e8fdf6297d
parentSwap around aliases in info command wrapper (diff)
Use a case-insensitive dict for cogs.
-rw-r--r--bot/__main__.py4
-rw-r--r--bot/utils.py47
2 files changed, 51 insertions, 0 deletions
diff --git a/bot/__main__.py b/bot/__main__.py
index 9f9c82077..6d5c2c063 100644
--- a/bot/__main__.py
+++ b/bot/__main__.py
@@ -4,6 +4,8 @@ import os
from discord import Game
from discord.ext.commands import AutoShardedBot, when_mentioned_or
+from bot.utils import CaseInsensitiveDict
+
bot = AutoShardedBot(
command_prefix=when_mentioned_or(
">>> self.", ">> self.", "> self.", "self.",
@@ -15,6 +17,8 @@ bot = AutoShardedBot(
help_attrs={"aliases": ["help()"]}
)
+bot.cogs = CaseInsensitiveDict()
+
# Internal/debug
bot.load_extension("bot.cogs.logging")
bot.load_extension("bot.cogs.security")
diff --git a/bot/utils.py b/bot/utils.py
new file mode 100644
index 000000000..eac37a4b4
--- /dev/null
+++ b/bot/utils.py
@@ -0,0 +1,47 @@
+# coding=utf-8
+
+
+class CaseInsensitiveDict(dict):
+ """
+ We found this class on StackOverflow. Thanks to m000 for writing it!
+
+ https://stackoverflow.com/a/32888599/4022104
+ """
+
+ @classmethod
+ def _k(cls, key):
+ return key.lower() if isinstance(key, str) else key
+
+ def __init__(self, *args, **kwargs):
+ super(CaseInsensitiveDict, self).__init__(*args, **kwargs)
+ self._convert_keys()
+
+ def __getitem__(self, key):
+ return super(CaseInsensitiveDict, self).__getitem__(self.__class__._k(key))
+
+ def __setitem__(self, key, value):
+ super(CaseInsensitiveDict, self).__setitem__(self.__class__._k(key), value)
+
+ def __delitem__(self, key):
+ return super(CaseInsensitiveDict, self).__delitem__(self.__class__._k(key))
+
+ def __contains__(self, key):
+ return super(CaseInsensitiveDict, self).__contains__(self.__class__._k(key))
+
+ def pop(self, key, *args, **kwargs):
+ return super(CaseInsensitiveDict, self).pop(self.__class__._k(key), *args, **kwargs)
+
+ def get(self, key, *args, **kwargs):
+ return super(CaseInsensitiveDict, self).get(self.__class__._k(key), *args, **kwargs)
+
+ def setdefault(self, key, *args, **kwargs):
+ return super(CaseInsensitiveDict, self).setdefault(self.__class__._k(key), *args, **kwargs)
+
+ def update(self, E=None, **F):
+ super(CaseInsensitiveDict, self).update(self.__class__(E))
+ super(CaseInsensitiveDict, self).update(self.__class__(**F))
+
+ def _convert_keys(self):
+ for k in list(self.keys()):
+ v = super(CaseInsensitiveDict, self).pop(k)
+ self.__setitem__(k, v)