Пример #1
0
    def __init__(self, *args, **kwargs):
        def prefix_manager(bot, message):
            """
            Retourne les préfixes du message du serveur si défini.
            Si aucun n'est défini ou si le message du server est None
            cela renverra les préfixes globaux à la place.

            Nécessite une instance Bot et un objet Message
            passé en arguments.
            """
            return bot.settings.get_prefixes(message.server)

        self.counter = Counter()
        self.uptime = datetime.datetime.utcnow()  # Refreshed before login
        self._message_modifiers = []
        self.settings = Settings()
        self._intro_displayed = False
        self._shutdown_mode = None
        self.logger = set_logger(self)
        self._last_exception = None
        self.oauth_url = ""
        self.printdebug = True

        if 'self_bot' in kwargs:
            self.settings.self_bot = kwargs['self_bot']
        else:
            kwargs['self_bot'] = self.settings.self_bot
            if self.settings.self_bot:
                kwargs['pm_help'] = False
        super().__init__(*args, command_prefix=prefix_manager, **kwargs)
Пример #2
0
    def __init__(self, *args, **kwargs):
        def prefix_manager(bot, message):
            """
            Zwraca prefixy serverowe, a jeśli nie istnieją, globalne

            wymaga instancji bota i wiadomości
            """
            return bot.settings.get_prefixes(message.server)

        self.counter = Counter()
        self.uptime = datetime.datetime.utcnow(
        )  # Odświerzane przed logowaniem
        self._message_modifiers = []
        self.settings = Settings()
        self._intro_displayed = False
        self._shutdown_mode = None
        self.logger = set_logger(self)
        self._last_exception = None
        self.oauth_url = ""
        if 'self_bot' in kwargs:
            self.settings.self_bot = kwargs['self_bot']
        else:
            kwargs['self_bot'] = self.settings.self_bot
            if self.settings.self_bot:
                kwargs['pm_help'] = False
        super().__init__(*args, command_prefix=prefix_manager, **kwargs)
Пример #3
0
    def __init__(self, *args, **kwargs):

        def prefix_manager(bot, message):
            """
            Returns prefixes of the message's server if set.
            If none are set or if the message's server is None
            it will return the global prefixes instead.

            Requires a Bot instance and a Message object to be
            passed as arguments.
            """
            return bot.settings.get_prefixes(message.server)

        self.counter = Counter()
        self.uptime = datetime.datetime.utcnow()  # Refreshed before login
        self._message_modifiers = []
        self.settings = Settings()
        self._intro_displayed = False
        self._shutdown_mode = None
        self.logger = set_logger(self)
        self._last_exception = None
        self.oauth_url = ""
        self.version = VERSION

        try:
            self._cog_registry = dataIO.load_json("data/bot/cogs.json")
        except Exception:
            self._cog_registry = {}

        super().__init__(*args, command_prefix=prefix_manager, **kwargs)
        
        # Unable to find a better way to fully override
        # the default help cmd, so had to do this instead. :C
        self.remove_command('help')
        self.command(**self.help_attrs)(_help_command)
Пример #4
0
    def __init__(self, *args, **kwargs):
        def prefix_manager(bot, message):
            """
            Returns prefixes of the message's server if set.
            If none are set or if the message's server is None
            it will return the global prefixes instead.

            Requires a Bot instance and a Message object to be
            passed as arguments.
            """
            return bot.settings.get_prefixes(message.server)

        self.counter = Counter()
        self.uptime = datetime.datetime.utcnow()  # Refreshed before login
        self._message_modifiers = []
        self.settings = Settings()
        self._intro_displayed = False
        self._shutdown_mode = None
        self.logger = set_logger(self)
        self._last_exception = None
        self.oauth_url = ""
        if 'self_bot' in kwargs:
            self.settings.self_bot = kwargs['self_bot']
        else:
            kwargs['self_bot'] = self.settings.self_bot
            if self.settings.self_bot:
                kwargs['pm_help'] = False
        super().__init__(*args, command_prefix=prefix_manager, **kwargs)
Пример #5
0
    def __init__(self, *args, **kwargs):
        self.logger = Logger("bot")
        self.settings = Settings()

        super().__init__(*args,
                         command_prefix=self.prefix_manager,
                         pm_help=False,
                         **kwargs)
Пример #6
0
    def __init__(self):
        super(MainWindow, self).__init__()

        self.large_font = QtGui.QFont("Arial", 12)
        self.reg_font = QtGui.QFont("Arial", 10)
        self.small_font = QtGui.QFont("Arial", 8)

        self.settings = Settings()
        self.init_ui()
Пример #7
0
def check_env(args):
    from cogs.utils.settings import Settings

    email = os.environ.get('RED_EMAIL', args.email)
    password = os.environ.get('RED_PASSWORD', args.password)
    token = os.environ.get('RED_TOKEN', args.token)

    if token and email:
        print("ERROR: You can only specify one of token or email")
        exit(1)
    elif token and ("@" in token or len(token) < 50):
        print("ERROR: Invalid token provided")
        exit(1)
    elif email and "@" not in email:
        print("ERROR: Invalid email provided")
        exit(1)
    elif email and not password:
        print("ERROR: Email authentication requires password")
        exit(1)

    s = Settings()

    # Set credentials if provided
    if token:
        if s.email not in [s.default_settings['EMAIL'], token]:
            print('WARNING: New token provided, overwriting old one')
        s.email = token
        s.login_type = 'token'
    elif email:
        if (s.email not in [s.default_settings['EMAIL'], email] or
                s.password not in [s.default_settings['PASSWORD'], password]):
            print('WARNING: New credentials provided, overwriting old ones')
        s.email = email
        s.password = password
        s.login_type = 'email'
    elif s.email == s.default_settings['EMAIL']:
        print("ERROR: No credentials set or provided.")
        exit(1)

    if s.prefixes == s.default_settings['PREFIXES']:
        default_prefix = os.environ.get('RED_PREFIX', args.prefix)
        if default_prefix:
            s.prefixes = [default_prefix]

    if s.bot_settings['default'] == s.default_settings['default']:
        admin = os.environ.get('RED_ADMIN', args.admin)
        mod = os.environ.get('RED_MOD', args.mod)
        if admin:
            s.default_admin = admin
        if mod:
            s.default_mod = mod

    userpath = os.path.expanduser('~')
    userbin = os.path.join(userpath, '.local/bin')
    currentpath = os.environ['PATH'].split(':')
    if userbin not in currentpath:
        currentpath.append(userbin)
        os.environ['PATH'] = ':'.join(currentpath)
Пример #8
0
    def __init__(self, *args, **kwargs):

        def prefix_manager(bot, message):
            """
            Returns prefixes of the message's server if set.
            If none are set or if the message's server is None
            it will return the global prefixes instead.

            Requires a Bot instance and a Message object to be
            passed as arguments.
            """
            return bot.settings.get_prefixes(message.server)

        self.counter = Counter()
        self.uptime = datetime.datetime.utcnow()  # Refreshed before login
        self._message_modifiers = []
        self.settings = Settings()
        self._intro_displayed = False
        self._shutdown_mode = None
        self.logger = set_logger(self)
        self._last_exception = None
        self.oauth_url = ""

        try:
            self._cog_registry = dataIO.load_json("data/red/cogs.json")
        except Exception:
            self._cog_registry = {}

        if 'self_bot' in kwargs:
            self.settings.self_bot = kwargs['self_bot']
        else:
            kwargs['self_bot'] = self.settings.self_bot
            if self.settings.self_bot:
                kwargs['pm_help'] = False
        super().__init__(*args, command_prefix=prefix_manager, **kwargs)
    def __init__(self, *args, **kwargs):
        def prefix_manager(bot, message):
            """
            Returns Prefixs of the server if set.
            If None are set or is none on server, returns global prefixs

            Requires an instance of Bot and Message Object to be passed as args.
            """
            return bot.settings.get_prefixes(message.server)

        self.counter = Counter()
        self.uptime = datetime.datetime.utcnow()  # Refreshed before bot Logins
        self._message_modifiers = []
        self.settings = Settings()
        self._intro_displayed = False
        self._shutdown_mode = None
        self.logger = set_logger(self)

        if 'self_bot' in kwargs:
            self.settings.self_bot = kwargs['self_bot']
        else:
            kwargs['self_bot'] = self.settings.self_bot
            if self.settings.self_bot:
                kwargs['pm_help'] = False
        super().__init__(*args, command_prefix=prefix_manager, **kwargs)
Пример #10
0
    def __init__(self, debug: bool = False):
        super().__init__(command_prefix=_get_prefix,
                         description=conf['bot']['description'])

        self.settings = Settings(**conf['default server settings'])
        self.debug = debug

        for extension in initial_extensions:
            try:
                self.load_extension(extension)
            except Exception as e:
                print(e)
Пример #11
0
    def __init__(self):
        super().__init__(command_prefix=_get_prefix)

        # This is kinda stupid, TODO: make not stupid
        with codecs.open("config.json", 'r', encoding='utf8') as f:
            self.config = json.load(f)

        self.settings = Settings(self.config['default_prefix'])

        # Load all cogs
        for file in os.listdir("cogs"):
            if file.endswith(".py"):
                name = file[:-3]
                self.load_extension(f"cogs.{name}")
Пример #12
0
    def __init__(self, *args, **kwargs):
        def prefix_manager(bot, message):
            """
            Returns prefixes of the message's server if set.
            If none are set or if the message's server is None
            it will return the global prefixes instead.

            Requires a Bot instance and a Message object to be
            passed as arguments.
            """
            return bot.settings.get_prefixes(message.server)

        self.counter = Counter()
        self.uptime = datetime.datetime.now()
        self._message_modifiers = []
        self.settings = Settings()
        super().__init__(*args, command_prefix=prefix_manager, **kwargs)
Пример #13
0
class Bot(commands.Bot):
    def __init__(self, *args, **kwargs):
        self.logger = Logger("bot")
        self.settings = Settings()

        super().__init__(*args,
                         command_prefix=self.prefix_manager,
                         pm_help=False,
                         **kwargs)

    def prefix_manager(self, bot: commands.Bot, message: Message) -> list:
        guild = message.guild
        if not guild:
            guild = None
        else:
            guild = guild.id
        return self.settings.getprefix(guild)
Пример #14
0
#
#
# red.py and cogs/utils/checks.py both contain some modified functions originally made by Rapptz
#             https://github.com/Rapptz/RoboDanny/tree/async
#

description = "Fish - A fully modular Discord Bot forked from Red!"

formatter = commands.HelpFormatter(show_check_failure=False)

bot = commands.Bot(command_prefix=["_"],
                   formatter=formatter,
                   description=description,
                   pm_help=None)

settings = Settings()


@bot.event
async def on_ready():
    owner_cog = bot.get_cog('Owner')
    total_cogs = len(owner_cog._list_cogs())
    users = len(set(bot.get_all_members()))
    servers = len(bot.servers)
    channels = len([c for c in bot.get_all_channels()])
    if not hasattr(bot, "uptime"):
        bot.uptime = int(time.perf_counter())
    if settings.login_type == "token" and settings.owner == "id_here":
        await set_bot_owner()
    print('------')
    print("{} is now online.".format(bot.user.name))
Пример #15
0
                        help="Sets debug to true")
    parser.add_argument(
        "-l",
        "--level",
        help="Sets debug level",
        choices=["critical", "error", "warning", "info", "debug"],
        default="warning")
    parser.add_argument("-d",
                        "--data-directory",
                        help="Define an alternate data directory location",
                        default="data")
    parser.add_argument("-f",
                        "--log-to-file",
                        action="store_true",
                        help="Save log to file",
                        default=True)

    args = parser.parse_args()

    data_dir = os.environ.get("BOT_DATA_DIR", args.data_directory)
    level = os.environ.get("BOT_LOG_LEVEL", args.level)
    to_file = os.environ.get("BOT_LOG_TO_FILE", args.log_to_file)

    if os.environ.get("BOT_DEBUG", args.debug):
        level = "debug"

    logger = Logger(location=data_dir, level=level, to_file=to_file).logger
    logger.debug("Data folder: %s" % data_dir)
    settings = Settings(data_dir=data_dir)
    Bot().run()
Пример #16
0
class Bot(commands.Bot):
    def __init__(self, *args, **kwargs):
        def prefix_manager(bot, message):
            """
            Returns prefixes of the message's server if set.
            If none are set or if the message's server is None
            it will return the global prefixes instead.

            Requires a Bot instance and a Message object to be
            passed as arguments.
            """
            return bot.settings.get_prefixes(message.server)

        self.counter = Counter()
        self.uptime = datetime.datetime.utcnow()  # Refreshed before login
        self._message_modifiers = []
        self.settings = Settings()
        self._intro_displayed = False
        self.logger = set_logger(self)
        if 'self_bot' in kwargs:
            self.settings.self_bot = kwargs['self_bot']
        else:
            kwargs['self_bot'] = self.settings.self_bot
        super().__init__(*args, command_prefix=prefix_manager, **kwargs)

    async def send_message(self, *args, **kwargs):
        if self._message_modifiers:
            if "content" in kwargs:
                pass
            elif len(args) == 2:
                args = list(args)
                kwargs["content"] = args.pop()
            else:
                return await super().send_message(*args, **kwargs)

            content = kwargs['content']
            for m in self._message_modifiers:
                try:
                    content = str(m(content))
                except:  # Faulty modifiers should not
                    pass  # break send_message
            kwargs['content'] = content

        return await super().send_message(*args, **kwargs)

    def add_message_modifier(self, func):
        """
        Adds a message modifier to the bot

        A message modifier is a callable that accepts a message's
        content as the first positional argument.
        Before a message gets sent, func will get called with
        the message's content as the only argument. The message's
        content will then be modified to be the func's return
        value.
        Exceptions thrown by the callable will be catched and
        silenced.
        """
        if not callable(func):
            raise TypeError("The message modifier function "
                            "must be a callable.")

        self._message_modifiers.append(func)

    def remove_message_modifier(self, func):
        """Removes a message modifier from the bot"""
        if func not in self._message_modifiers:
            raise RuntimeError("Function not present in the message "
                               "modifiers.")

        self._message_modifiers.remove(func)

    def clear_message_modifiers(self):
        """Removes all message modifiers from the bot"""
        self._message_modifiers.clear()

    async def send_cmd_help(self, ctx):
        if ctx.invoked_subcommand:
            pages = self.formatter.format_help_for(ctx, ctx.invoked_subcommand)
            for page in pages:
                await self.send_message(ctx.message.channel, page)
        else:
            pages = self.formatter.format_help_for(ctx, ctx.command)
            for page in pages:
                await self.send_message(ctx.message.channel, page)

    def user_allowed(self, message):
        author = message.author

        if author.bot:
            return False

        if author == self.user:
            return self.settings.self_bot

        mod = self.get_cog('Mod')

        if mod is not None:
            if self.settings.owner == author.id:
                return True
            if not message.channel.is_private:
                server = message.server
                names = (self.settings.get_server_admin(server),
                         self.settings.get_server_mod(server))
                results = map(
                    lambda name: discord.utils.get(author.roles, name=name),
                    names)
                for r in results:
                    if r is not None:
                        return True

            if author.id in mod.blacklist_list:
                return False

            if mod.whitelist_list:
                if author.id not in mod.whitelist_list:
                    return False

            if not message.channel.is_private:
                if message.server.id in mod.ignore_list["SERVERS"]:
                    return False

                if message.channel.id in mod.ignore_list["CHANNELS"]:
                    return False
            return True
        else:
            return True
Пример #17
0
# The following have to be imported and initialized in the correct order
from cogs.utils.settings import Settings
settings = Settings()

from cogs.utils.botdata import BotData
botdata = BotData()

import cogs.utils.loggingdb as loggingdb
loggingdb_session = loggingdb.create_session(settings.resource("loggingdb.db"))

from cogs.utils.httpgetter import HttpGetter
httpgetter = HttpGetter()

from cogs.utils.helpers import *
import discord
import traceback
import asyncio
import string
from discord.ext import commands
import logging
import datetime
from cogs.utils.helpcommand import MangoHelpCommand
from cogs.utils.clip import *
from cogs.utils.commandargs import *

logging.basicConfig(level=logging.INFO)


description = """The juiciest unsigned 8 bit integer you is eva gonna see.
				For more information about me, try `{cmdpfx}info`"""
Пример #18
0
class Bot(commands.Bot):
    def __init__(self, *args, **kwargs):
        def prefix_manager(bot, message):
            """
            Zwraca prefixy serverowe, a jeśli nie istnieją, globalne

            wymaga instancji bota i wiadomości
            """
            return bot.settings.get_prefixes(message.server)

        self.counter = Counter()
        self.uptime = datetime.datetime.utcnow(
        )  # Odświerzane przed logowaniem
        self._message_modifiers = []
        self.settings = Settings()
        self._intro_displayed = False
        self._shutdown_mode = None
        self.logger = set_logger(self)
        self._last_exception = None
        self.oauth_url = ""
        if 'self_bot' in kwargs:
            self.settings.self_bot = kwargs['self_bot']
        else:
            kwargs['self_bot'] = self.settings.self_bot
            if self.settings.self_bot:
                kwargs['pm_help'] = False
        super().__init__(*args, command_prefix=prefix_manager, **kwargs)

    async def send_message(self, *args, **kwargs):
        if self._message_modifiers:
            if "content" in kwargs:
                pass
            elif len(args) == 2:
                args = list(args)
                kwargs["content"] = args.pop()
            else:
                return await super().send_message(*args, **kwargs)

            content = kwargs['content']
            for m in self._message_modifiers:
                try:
                    content = str(m(content))
                except:  # złe modyfikatory
                    pass  # nie zepsują wiadomości
            kwargs['content'] = content

        return await super().send_message(*args, **kwargs)

    async def shutdown(self, *, restart=False):
        """wyłącza bota z kodem 1

        jeśli restart=true bot spróbuje się zrestartować z kodem 26"""
        self._shutdown_mode = not restart
        await self.logout()

    def add_message_modifier(self, func):
        """
        Dodaje modyfikator do wiadomości

        Można wywołać coś zawartością wiadomości
        przed wysłaniem wiadmości funkcja zostanie zawołana z treścią jako argumentem
        Excepcje wyrzucone zostaną wyciszone
        """
        if not callable(func):
            raise TypeError("Funkcja modyfikatora wiadmości "
                            "musi bć zdolna do bycia wywołaną.")

        self._message_modifiers.append(func)

    def remove_message_modifier(self, func):
        """Usuwa modyfikator wiadomości"""
        if func not in self._message_modifiers:
            raise RuntimeError(
                "Funkcja nie istnieje w modyfikatorach wiadomości")

        self._message_modifiers.remove(func)

    def clear_message_modifiers(self):
        """Usuwa wszystkie modyfikatory wiadmości"""
        self._message_modifiers.clear()

    async def send_cmd_help(self, ctx):
        if ctx.invoked_subcommand:
            pages = self.formatter.format_help_for(ctx, ctx.invoked_subcommand)
            for page in pages:
                await self.send_message(ctx.message.channel, page)
        else:
            pages = self.formatter.format_help_for(ctx, ctx.command)
            for page in pages:
                await self.send_message(ctx.message.channel, page)

    def user_allowed(self, message):
        author = message.author

        if author.bot:
            return False

        if author == self.user:
            return self.settings.self_bot

        mod_cog = self.get_cog('Mod')
        global_ignores = self.get_cog('Owner').global_ignores

        if self.settings.owner == author.id:
            return True

        if author.id in global_ignores["blacklist"]:
            return False

        if global_ignores["whitelist"]:
            if author.id not in global_ignores["whitelist"]:
                return False

        if not message.channel.is_private:
            server = message.server
            names = (self.settings.get_server_admin(server),
                     self.settings.get_server_mod(server))
            results = map(
                lambda name: discord.utils.get(author.roles, name=name), names)
            for r in results:
                if r is not None:
                    return True

        if mod_cog is not None:
            if not message.channel.is_private:
                if message.server.id in mod_cog.ignore_list["SERVERS"]:
                    return False

                if message.channel.id in mod_cog.ignore_list["CHANNELS"]:
                    return False

        return True

    async def pip_install(self, name, *, timeout=None):
        """
        Bezpiecznie instaluje pakiet pip w folderze lib

        Zwraca boolean jeśli się powiodło
        """

        IS_MAC = sys.platform == "darwin"
        interpreter = sys.executable

        if interpreter is None:
            raise RuntimeError("Nie moge znaleźć interpretatora Pythona")

        args = [
            interpreter, "-m", "pip", "install", "--upgrade", "--target",
            "lib", name
        ]

        if IS_MAC:  # --target is a problem on Homebrew. See PR #552
            args.remove("--target")
            args.remove("lib")

        def install():
            code = subprocess.call(args)
            sys.path_importer_cache = {}
            return not bool(code)

        response = self.loop.run_in_executor(None, install)
        return await asyncio.wait_for(response, timeout=timeout)
Пример #19
0
class Bot(commands.Bot):
    def __init__(self, *args, **kwargs):
        def prefix_manager(bot, message):
            """
            Retourne les préfixes du message du serveur si défini.
            Si aucun n'est défini ou si le message du server est None
            cela renverra les préfixes globaux à la place.

            Nécessite une instance Bot et un objet Message
            passé en arguments.
            """
            return bot.settings.get_prefixes(message.server)

        self.counter = Counter()
        self.uptime = datetime.datetime.utcnow()  # Refreshed before login
        self._message_modifiers = []
        self.settings = Settings()
        self._intro_displayed = False
        self._shutdown_mode = None
        self.logger = set_logger(self)
        self._last_exception = None
        self.oauth_url = ""
        self.printdebug = True

        if 'self_bot' in kwargs:
            self.settings.self_bot = kwargs['self_bot']
        else:
            kwargs['self_bot'] = self.settings.self_bot
            if self.settings.self_bot:
                kwargs['pm_help'] = False
        super().__init__(*args, command_prefix=prefix_manager, **kwargs)

    async def check_is_command(self, message):
        _internal_channel = message.channel
        _internal_author = message.author

        view = commands.view.StringView(message.content)

        prefix = await bot._get_prefix(message)
        invoked_prefix = prefix

        if not isinstance(prefix, (tuple, list)):
            if not view.skip_string(prefix):
                return False
        else:
            invoked_prefix = discord.utils.find(view.skip_string, prefix)
            if invoked_prefix is None:
                return False

        invoker = view.get_word()
        # tmp = {
        #     'bot': self,
        #     'invoked_with': invoker,
        #     'message': message,
        #     'view': view,
        #     'prefix': invoked_prefix
        # }
        # ctx = commands.Context(**tmp)
        # del tmp

        if invoker in self.commands:
            return True
            # command = self.commands[invoker]
            # self.dispatch('command', command, ctx)
            # try:
            #     yield from command.invoke(ctx)
            # except CommandError as e:
            #     ctx.command.dispatch_error(e, ctx)
            # else:
            #     self.dispatch('command_completion', command, ctx)
        elif invoker:
            return False
            # exc = CommandNotFound('Command "{}" is not found'.format(invoker))
            # self.dispatch('command_error', exc, ctx)

    async def check_for_passthru_command(self, message):
        allowed_passthru_cmd = ('cleanup', 'mute', 'unmute', 'candidate')
        view = commands.view.StringView(message.content)
        # if self._skip_check(message.author, self.user):
        #     return

        prefix = await bot._get_prefix(message)
        invoked_prefix = prefix

        if not isinstance(prefix, (tuple, list)):
            if not view.skip_string(prefix):
                return
        else:
            invoked_prefix = discord.utils.find(view.skip_string, prefix)
            if invoked_prefix is None:
                return

        invoker = view.get_word()

        if invoker in allowed_passthru_cmd:
            return True
        else:
            return False

    async def send_message(self, *args, **kwargs):
        if self._message_modifiers:
            if "content" in kwargs:
                pass
            elif len(args) == 2:
                args = list(args)
                kwargs["content"] = args.pop()
            else:
                return await super().send_message(*args, **kwargs)

            content = kwargs['content']
            for m in self._message_modifiers:
                try:
                    content = str(m(content))
                except:  # Faulty modifiers should not
                    pass  # break send_message
            kwargs['content'] = content

        return await super().send_message(*args, **kwargs)

    async def shutdown(self, *, restart=False):
        """Quitte le Bot gracieusement avec le code de sortie 0

        Si restart a la valeur True, le code de sortie sera 26
        Le lanceur redémarre automatiquement le Bot lorsque cela se produit"""
        self._shutdown_mode = not restart
        await self.logout()

    def add_message_modifier(self, func):
        """
        Ajoute un modificateur de message au bot

        Un modificateur de message est un appelable qui accepte un message
        contenu comme premier argument positionnel.
        Avant qu'un message ne soit envoyé, la fonction sera appelé avec
        le contenu du message comme seul argument. Le contenu du message 
        sera ensuite modifé pour être la seule valeur de retour de la 
        fonction.
		Les exceptions lancées par l'appelable seront captées et
        réduites au silence.
        """
        if not callable(func):
            raise TypeError("La fonction de modificataeur de message "
                            "doit être un appelable.")

        self._message_modifiers.append(func)

    def remove_message_modifier(self, func):
        """Supprime un modificateur de message du bot"""
        if func not in self._message_modifiers:
            raise RuntimeError("Fonction non présente dans le "
                               "modificateur de message.")

        self._message_modifiers.remove(func)

    def clear_message_modifiers(self):
        """Supprime tous les modificateurs de message du bot"""
        self._message_modifiers.clear()

    async def send_cmd_help(self, ctx):
        print("went here 1")
        if ctx.invoked_subcommand:
            print("went here 2")
            pages = self.formatter.format_help_for(ctx, ctx.invoked_subcommand)
            for page in pages:
                await self.send_message(ctx.message.channel, page)
        else:
            print("went here 3")
            pages = self.formatter.format_help_for(ctx, ctx.command)
            for page in pages:
                await self.send_message(ctx.message.channel, page)

    def user_allowed(self, message):
        author = message.author

        if author.bot:
            return False

        if author == self.user:
            return self.settings.self_bot

        mod_cog = self.get_cog('Mod')
        global_ignores = self.get_cog('Owner').global_ignores

        if self.settings.owner == author.id:
            return True

        if author.id in global_ignores["blacklist"]:
            return False

        if global_ignores["whitelist"]:
            if author.id not in global_ignores["whitelist"]:
                return False

        if not message.channel.is_private:
            server = message.server
            names = (self.settings.get_server_cocap(server),
                     self.settings.get_server_admin(server),
                     self.settings.get_server_mod(server),
                     self.settings.get_server_sel(server))
            results = map(
                lambda name: discord.utils.get(author.roles, name=name), names)
            for r in results:
                if r is not None:
                    return True

        if mod_cog is not None:
            if not message.channel.is_private:
                if message.server.id in mod_cog.ignore_list["SERVERS"]:
                    return False

                if message.channel.id in mod_cog.ignore_list["CHANNELS"]:
                    return False

        return True

    async def pip_install(self, name, *, timeout=None):
        """
        Installe un paquet pip dans le dossier local 'lib' dans un thread sécurisé.
        Sur les systèmes Mac, le dossier 'lib' n'est pas utilisé.
        Peut spécifier les secondes maximum à attendre pour que la tâche soit terminée

        Retourne un booléen indiquant si l'installation a réussi
        """

        IS_MAC = sys.platform == "darwin"
        interpreter = sys.executable

        if interpreter is None:
            raise RuntimeError(
                "Impossible de trouver l'interpréteur de Python")

        args = [
            interpreter, "-m", "pip", "install", "--upgrade", "--target",
            "lib", name
        ]

        if IS_MAC:  # --target is a problem on Homebrew. See PR #552
            args.remove("--target")
            args.remove("lib")

        def install():
            code = subprocess.call(args)
            sys.path_importer_cache = {}
            return not bool(code)

        response = self.loop.run_in_executor(None, install)
        return await asyncio.wait_for(response, timeout=timeout)
Пример #20
0
# The following have to be imported and initialized in the correct order
from cogs.utils.settings import Settings

settings = Settings()

from cogs.utils.botdata import BotData

botdata = BotData()

from cogs.utils.loggingdb import LoggingDb

loggingdb = LoggingDb(settings.resource("loggingdb.db"))

from cogs.utils.httpgetter import HttpGetter

httpgetter = HttpGetter()

from cogs.utils.helpers import *
import discord
import traceback
import asyncio
import string
from discord.ext import commands
import logging
import datetime
from cogs.utils.helpcommand import MangoHelpCommand
from cogs.utils.clip import *
from cogs.utils.commandargs import *
import json
import sys
import inspect
Пример #21
0
class Bot(commands.Bot):
    def __init__(self, *args, **kwargs):

        def prefix_manager(bot, message):
            """
            Returns prefixes of the message's server if set.
            If none are set or if the message's server is None
            it will return the global prefixes instead.

            Requires a Bot instance and a Message object to be
            passed as arguments.
            """
            return bot.settings.get_prefixes(message.server)

        self.counter = Counter()
        self.uptime = datetime.datetime.utcnow()  # Refreshed before login
        self._message_modifiers = []
        self.settings = Settings()
        self._intro_displayed = False
        self._shutdown_mode = None
        self.logger = set_logger(self)
        self._last_exception = None
        self.oauth_url = ""

        try:
            self._cog_registry = dataIO.load_json("data/red/cogs.json")
        except Exception:
            self._cog_registry = {}

        if 'self_bot' in kwargs:
            self.settings.self_bot = kwargs['self_bot']
        else:
            kwargs['self_bot'] = self.settings.self_bot
            if self.settings.self_bot:
                kwargs['pm_help'] = False
        super().__init__(*args, command_prefix=prefix_manager, **kwargs)

    async def send_message(self, *args, **kwargs):
        if self._message_modifiers:
            if "content" in kwargs:
                pass
            elif len(args) == 2:
                args = list(args)
                kwargs["content"] = args.pop()
            else:
                return await super().send_message(*args, **kwargs)

            content = kwargs['content']
            for m in self._message_modifiers:
                try:
                    content = str(m(content))
                except:   # Faulty modifiers should not
                    pass  # break send_message
            kwargs['content'] = content

        return await super().send_message(*args, **kwargs)

    async def shutdown(self, *, restart=False):
        """Gracefully quits Red with exit code 0

        If restart is True, the exit code will be 26 instead
        The launcher automatically restarts Red when that happens"""
        self._shutdown_mode = not restart
        await self.logout()

    def add_message_modifier(self, func):
        """
        Adds a message modifier to the bot

        A message modifier is a callable that accepts a message's
        content as the first positional argument.
        Before a message gets sent, func will get called with
        the message's content as the only argument. The message's
        content will then be modified to be the func's return
        value.
        Exceptions thrown by the callable will be catched and
        silenced.
        """
        if not callable(func):
            raise TypeError("The message modifier function "
                            "must be a callable.")

        self._message_modifiers.append(func)

    def remove_message_modifier(self, func):
        """Removes a message modifier from the bot"""
        if func not in self._message_modifiers:
            raise RuntimeError("Function not present in the message "
                               "modifiers.")

        self._message_modifiers.remove(func)

    def clear_message_modifiers(self):
        """Removes all message modifiers from the bot"""
        self._message_modifiers.clear()

    async def send_cmd_help(self, ctx):
        if ctx.invoked_subcommand:
            pages = self.formatter.format_help_for(ctx, ctx.invoked_subcommand)
            for page in pages:
                await self.send_message(ctx.message.channel, page)
        else:
            pages = self.formatter.format_help_for(ctx, ctx.command)
            for page in pages:
                await self.send_message(ctx.message.channel, page)

    def user_allowed(self, message):
        author = message.author

        if author.bot:
            return False

        if author == self.user:
            return self.settings.self_bot

        mod_cog = self.get_cog('Mod')
        global_ignores = self.get_cog('Owner').global_ignores

        if self.settings.owner == author.id:
            return True

        if author.id in global_ignores["blacklist"]:
            return False

        if global_ignores["whitelist"]:
            if author.id not in global_ignores["whitelist"]:
                return False

        if not message.channel.is_private:
            server = message.server
            names = (self.settings.get_server_admin(
                server), self.settings.get_server_mod(server))
            results = map(
                lambda name: discord.utils.get(author.roles, name=name),
                names)
            for r in results:
                if r is not None:
                    return True

        if mod_cog is not None:
            if not message.channel.is_private:
                if message.server.id in mod_cog.ignore_list["SERVERS"]:
                    return False

                if message.channel.id in mod_cog.ignore_list["CHANNELS"]:
                    return False

        return True

    async def pip_install(self, name, *, timeout=None):
        """
        Installs a pip package in the local 'lib' folder in a thread safe
        way. On Mac systems the 'lib' folder is not used.
        Can specify the max seconds to wait for the task to complete

        Returns a bool indicating if the installation was successful
        """

        IS_MAC = sys.platform == "darwin"
        interpreter = sys.executable

        if interpreter is None:
            raise RuntimeError("Couldn't find Python's interpreter")

        args = [
            interpreter, "-m",
            "pip", "install",
            "--upgrade",
            "--target", "lib",
            name
        ]

        if IS_MAC: # --target is a problem on Homebrew. See PR #552
            args.remove("--target")
            args.remove("lib")

        def install():
            code = subprocess.call(args)
            sys.path_importer_cache = {}
            return not bool(code)

        response = self.loop.run_in_executor(None, install)
        return await asyncio.wait_for(response, timeout=timeout)

    def set_cog(self, cog, value, save=True):
        self._cog_registry[cog] = value

        if save:
            self.save_cogs()

    def save_cogs(self):
        dataIO.save_json("data/red/cogs.json", self._cog_registry)

    @property
    def first_run(self):
        return self.settings.bot_settings == self.settings.default_settings
Пример #22
0
 def __init__(self, *args, **kwargs):
     self.counter = Counter()
     self.uptime = datetime.datetime.now()
     self._message_modifiers = []
     self.settings = Settings()
     super().__init__(*args, **kwargs)
Пример #23
0
from discord.ext import commands

# User Defined Libraries/Modules/Packages
from cogs.utils.settings import Settings

intents = Intents.all()

# Initialsing bot with the prefix as `!` and
# removing the default Help Command
bot = commands.Bot(command_prefix="!", help_command=None, intents=intents)


# To import and Load all Modules
def loadTheCogs(bot):
    cogs_dir = "cogs"
    # Getting all the python files present in `cogs` to a List
    pythonFiles = [File for File in listdir(cogs_dir) if File.endswith(".py")]

    for File in pythonFiles:
        extension = File.replace('.py', '')
        try:
            bot.load_extension(cogs_dir + "." + extension)
        except (ClientException, ModuleNotFoundError):
            print(f'Failed to load extension {extension}.')
            traceback.print_exc()


if __name__ == "__main__":
    loadTheCogs(bot)
    bot.run(Settings().SECRETS['DISCORD_TOKEN'])
Пример #24
0
class Bot(commands.Bot):
    def __init__(self, *args, **kwargs):
        def prefix_manager(bot, message):
            """
            Returns prefixes of the message's server if set.
            If none are set or if the message's server is None
            it will return the global prefixes instead.

            Requires a Bot instance and a Message object to be
            passed as arguments.
            """
            return bot.settings.get_prefixes(message.server)

        self.counter = Counter()
        self.uptime = datetime.datetime.utcnow()  # Refreshed before login
        self._message_modifiers = []
        self.settings = Settings()
        self._intro_displayed = False
        self._shutdown_mode = None
        self.logger = set_logger(self)
        self._last_exception = None
        self.oauth_url = ""
        if 'self_bot' in kwargs:
            self.settings.self_bot = kwargs['self_bot']
        else:
            kwargs['self_bot'] = self.settings.self_bot
            if self.settings.self_bot:
                kwargs['pm_help'] = False
        super().__init__(*args, command_prefix=prefix_manager, **kwargs)

    async def send_message(self, *args, **kwargs):
        if self._message_modifiers:
            if "content" in kwargs:
                pass
            elif len(args) == 2:
                args = list(args)
                kwargs["content"] = args.pop()
            else:
                return await super().send_message(*args, **kwargs)

            content = kwargs['content']
            for m in self._message_modifiers:
                try:
                    content = str(m(content))
                except:  # Faulty modifiers should not
                    pass  # break send_message
            kwargs['content'] = content

        return await super().send_message(*args, **kwargs)

    async def shutdown(self, *, restart=False):
        """Gracefully quits Red with exit code 0

        If restart is True, the exit code will be 26 instead
        The launcher automatically restarts Red when that happens"""
        self._shutdown_mode = not restart
        await self.logout()

    def add_message_modifier(self, func):
        """
        Adds a message modifier to the bot

        A message modifier is a callable that accepts a message's
        content as the first positional argument.
        Before a message gets sent, func will get called with
        the message's content as the only argument. The message's
        content will then be modified to be the func's return
        value.
        Exceptions thrown by the callable will be catched and
        silenced.
        """
        if not callable(func):
            raise TypeError("The message modifier function "
                            "must be a callable.")

        self._message_modifiers.append(func)

    def remove_message_modifier(self, func):
        """Removes a message modifier from the bot"""
        if func not in self._message_modifiers:
            raise RuntimeError("Function not present in the message "
                               "modifiers.")

        self._message_modifiers.remove(func)

    def clear_message_modifiers(self):
        """Removes all message modifiers from the bot"""
        self._message_modifiers.clear()

    async def send_cmd_help(self, ctx):
        if ctx.invoked_subcommand:
            pages = self.formatter.format_help_for(ctx, ctx.invoked_subcommand)
            for page in pages:
                await self.send_message(ctx.message.channel, page)
        else:
            pages = self.formatter.format_help_for(ctx, ctx.command)
            for page in pages:
                await self.send_message(ctx.message.channel, page)

    def user_allowed(self, message):
        author = message.author

        if author.bot:
            return False

        if author == self.user:
            return self.settings.self_bot

        mod_cog = self.get_cog('Mod')
        global_ignores = self.get_cog('Owner').global_ignores

        if self.settings.owner == author.id:
            return True

        if author.id in global_ignores["blacklist"]:
            return False

        if global_ignores["whitelist"]:
            if author.id not in global_ignores["whitelist"]:
                return False

        if not message.channel.is_private:
            server = message.server
            names = (self.settings.get_server_admin(server),
                     self.settings.get_server_mod(server))
            results = map(
                lambda name: discord.utils.get(author.roles, name=name), names)
            for r in results:
                if r is not None:
                    return True

        if mod_cog is not None:
            if not message.channel.is_private:
                if message.server.id in mod_cog.ignore_list["SERVERS"]:
                    return False

                if message.channel.id in mod_cog.ignore_list["CHANNELS"]:
                    return False

        return True

    async def pip_install(self, name, *, timeout=None):
        """
        Installs a pip package in the local 'lib' folder in a thread safe
        way. On Mac systems the 'lib' folder is not used.
        Can specify the max seconds to wait for the task to complete

        Returns a bool indicating if the installation was successful
        """

        IS_MAC = sys.platform == "darwin"
        interpreter = sys.executable

        if interpreter is None:
            raise RuntimeError("Couldn't find Python's interpreter")

        args = [
            interpreter, "-m", "pip", "install", "--upgrade", "--target",
            "lib", name
        ]

        if IS_MAC:  # --target is a problem on Homebrew. See PR #552
            args.remove("--target")
            args.remove("lib")

        def install():
            code = subprocess.call(args)
            sys.path_importer_cache = {}
            return not bool(code)

        response = self.loop.run_in_executor(None, install)
        return await asyncio.wait_for(response, timeout=timeout)
Пример #25
0
            self.logger.error(traceback.extract_tb(tb))
            print(e)


if __name__ == "__main__":
    parser = ArgumentParser(prog="Roxedus' ProgBott",
                            description="Programmeringsbot for Norsk programmering",
                            formatter_class=RawTextHelpFormatter)

    parser.add_argument("-D", "--debug", action="store_true", help="Sets debug to true")
    parser.add_argument("-l", "--level", help="Sets debug level",
                        choices=["critical", "error", "warning", "info", "debug"], default="warning")
    parser.add_argument("-d", "--data-directory",
                        help="Define an alternate data directory location", default="data", type=str)
    parser.add_argument("-f", "--log-to-file", action="store_true", help="Save log to file", default=True)

    args = parser.parse_args()

    level = args.level
    data_dir = args.data_directory

    if args.debug:
        level = "DEBUG"

    settings = Settings(data_dir=data_dir, log_level=level, log_to_file=args.log_to_file)

    logger = Logger(location=settings.data_dir, level=settings.log_level, to_file=settings.log_to_file).logger
    logger.debug("Data folder: %s", settings.data_dir)

    Bot().run()
Пример #26
0
class MainWindow(QWidget):
    def __init__(self):
        super(MainWindow, self).__init__()

        self.large_font = QtGui.QFont("Arial", 12)
        self.reg_font = QtGui.QFont("Arial", 10)
        self.small_font = QtGui.QFont("Arial", 8)

        self.settings = Settings()
        self.init_ui()

    def init_ui(self):

        # v.box
        gbox = QtWidgets.QGridLayout()
        box = QtWidgets.QVBoxLayout()
        self.rbox = QtWidgets.QVBoxLayout()
        self.hbox = QtWidgets.QHBoxLayout()

        # padding/margins
        gbox.setContentsMargins(0, 0, 0, 0)
        self.rbox.setContentsMargins(0, 0, 10, 10)
        self.hbox.setContentsMargins(0, 0, 10, 10)
        box.addStretch()
        self.hbox.addStretch()
        gbox.setSpacing(10)
        box.setSpacing(0)
        self.rbox.setSpacing(5)
        self.hbox.setSpacing(0)

        image = QtGui.QImage()
        image.loadFromData(
            urllib.request.urlopen('http://i.imgur.com/04DUqa3.png').read())
        png = QLabel(self)
        pixmap = QtGui.QPixmap(image)
        png.setPixmap(pixmap)
        gbox.addWidget(png, 0, 0, 1, 1, Qt.AlignTop)

        box.insertSpacing(1, 10)
        self.l1 = QLabel(self)
        self.l1.setWordWrap(True)
        self.large_font.setBold(True)
        self.l1.setFont(self.large_font)
        box.addWidget(self.l1, 0, Qt.AlignTop)

        hline = QtWidgets.QFrame()
        hline.setFrameShape(QtWidgets.QFrame.HLine)
        hline.setFrameShadow(QtWidgets.QFrame.Sunken)
        gbox.addWidget(hline, 0, 0, 1, 3, Qt.AlignBottom)

        # start form
        self.req_ui()

        self.rbox.setAlignment(Qt.AlignTop)
        box.addLayout(self.rbox, 1)
        gbox.addLayout(box, 0, 1, 1, 2)
        gbox.addLayout(self.hbox, 1, 0, 1, 3)
        self.setLayout(gbox)

        # window
        self.setFixedSize(490, 400)
        self.setWindowIcon(QtGui.QIcon('red.ico'))
        self.setWindowTitle('Red Discord Bot - Setup')
        self.show()

    def buttons_panel(self):
        self.b1 = QPushButton("Back", self)
        self.b1.setMaximumWidth(75)
        self.hbox.addWidget(self.b1, 0, Qt.AlignRight)
        self.b2 = QPushButton("Next >", self)
        self.b2.setMaximumWidth(75)
        self.hbox.addWidget(self.b2, 0, Qt.AlignRight)
        self.hbox.insertSpacing(20, 20)
        self.b3 = QPushButton("Cancel", self)
        self.b3.setMaximumWidth(75)
        self.hbox.addWidget(self.b3, 0, Qt.AlignRight)

    def req_ui(self):
        self.clear_layout(self.rbox)
        self.clear_layout(self.hbox)
        self.hbox.addStretch()
        self.l1.setText('Select which requirements to install')

        self.rbox.insertSpacing(1, 35)
        self.r1 = QRadioButton(
            "Install basic + audio requirements (recommended)")
        self.r1.setChecked(True)
        self.r1.setFont(self.reg_font)
        self.rbox.addWidget(self.r1, 0, Qt.AlignTop)
        self.r2 = QRadioButton("Install basic requirements")
        self.r2.setFont(self.reg_font)
        self.rbox.addWidget(self.r2, 0, Qt.AlignLeft)

        if os.path.exists("lib"):
            l5 = QLabel(self)
            l5.setText(
                '<font color="#ff0000">Requirements already installed.</font>')
            self.rbox.addWidget(l5, 1, Qt.AlignBottom)
            b5 = QPushButton("Skip", self)
            b5.setMaximumWidth(50)
            self.rbox.addWidget(b5, 0, Qt.AlignBottom)
            b5.clicked.connect(self.token_ui)

        # buttons
        self.buttons_panel()

        # binds
        self.b1.setEnabled(False)
        self.b2.clicked.connect(self.if_req)
        self.b3.clicked.connect(self.close_prompt)

    def if_req(self):
        if self.r1.isChecked():
            self.console_ui(audio=True)
        elif self.r2.isChecked():
            self.console_ui(audio=False)

    def console_ui(self, audio):
        self.clear_layout(self.rbox)
        self.clear_layout(self.hbox)
        self.hbox.addStretch()
        self.l1.setText("Installing requirements")

        self.process = QProcess()
        self.output = QTextEdit()
        self.percent = 0

        self.rbox.insertSpacing(1, 10)
        l2 = QLabel(
            'Press Next when the last line says "Successfully Installed--"')
        self.rbox.addWidget(l2, 0, Qt.AlignTop)
        # this can be uncommented whenever I actually figure out Progress Bars
        # self.pbar = QtWidgets.QProgressBar()
        # self.pbar.setGeometry(30, 40, 200, 25)
        # self.rbox.addWidget(self.pbar)

        b5 = QPushButton("Dialog", self)
        b5.setMaximumWidth(75)

        self.rbox.addWidget(b5)
        self.rbox.addWidget(self.output)
        self.process.readyRead.connect(self.console_data)
        self.output.hide()

        # data flow
        remove_reqs_readonly()
        interpreter = sys.executable

        if interpreter is None:
            QMessageBox.warning(self, "404", "Python interpreter not found.")
            self.close()

        txt = REQS_TXT if audio else REQS_NO_AUDIO_TXT
        args = [
            "-m", "pip", "install", "--upgrade", "--target", REQS_DIR, "-r",
            txt
        ]

        if IS_MAC:  # --target is a problem on Homebrew. See PR #552
            args.remove("--target")
            args.remove(REQS_DIR)

        # do call
        self.process.start(interpreter, args)

        # buttons
        self.buttons_panel()

        # binds
        self.b1.setEnabled(True)
        # self.b2.setEnabled(False)
        self.b1.clicked.connect(self.req_ui)
        self.b1.clicked.connect(self.process.close)
        self.b2.clicked.connect(self.token_ui)
        self.b3.clicked.connect(self.close_prompt)
        b5.clicked.connect(self.console_hide)

    def console_hide(self):
        if self.output.isVisible():
            self.output.hide()
        else:
            self.output.show()

    def console_data(self):
        js = str(self.process.readAll(), 'utf-8')

        cursor = self.output.textCursor()
        cursor.movePosition(cursor.End)
        cursor.insertText(js)
        self.output.ensureCursorVisible()

        # self.percent += 3
        # if self.percent > 90:
        #     self.percent = 100
        # self.pbar.setValue(self.percent)
        #
        # if self.percent == 100:
        #     QMessageBox.information(self, "Done!", "Requirements setup completed.")
        #     self.b2.setEnabled(True)

    def token_ui(self):
        self.clear_layout(self.rbox)
        self.clear_layout(self.hbox)
        self.hbox.addStretch()
        self.l1.setText("Input your bot's token")

        self.rbox.insertSpacing(1, 30)
        self.token_print = QLabel(self)
        self.token_print.setText("Token: ")
        self.rbox.addWidget(self.token_print, 0, Qt.AlignTop)
        self.token_edit = QLineEdit(self)
        self.token_edit.setMaximumWidth(300)
        self.rbox.addWidget(self.token_edit, 0, Qt.AlignTop)

        l2 = QLabel(
            "Your token can be found in Discord's "
            "<a href='https://discordapp.com/developers/applications/me'>App Page</a>"
        )
        l2.setOpenExternalLinks(True)
        l2.setFont(self.small_font)
        self.rbox.addWidget(l2, 0, Qt.AlignBottom)

        if self.settings.token is not None:
            l5 = QLabel(self)
            l5.setText('<font color="#ff0000">"' + self.settings.token[0:10] +
                       '--"</font>\nis your current token')
            self.rbox.addWidget(l5, 1, Qt.AlignBottom)
            b5 = QPushButton("Skip", self)
            b5.setMaximumWidth(50)
            self.rbox.addWidget(b5, 0, Qt.AlignBottom)
            b5.clicked.connect(self.prefix_ui)

        # buttons
        self.buttons_panel()
        # token1 = token_edit.text()

        # binds
        self.b1.setEnabled(False)
        self.token_edit.textChanged[str].connect(self.token_on_change)
        self.b1.clicked.connect(self.req_ui)
        self.b2.clicked.connect(self.token_save)
        self.b3.clicked.connect(self.close_prompt)

    def token_save(self):
        token = str(self.token_edit.text())
        if "@" in token or len(token) < 50:
            QMessageBox.information(self, "Error!", "Invalid token provided.",
                                    QMessageBox.Ok)
            return
        else:
            self.settings.token = token
            self.prefix_ui()

    def token_on_change(self, text):
        self.token_print.setText("Token: " + text.replace('.', '.\n'))
        self.token_print.adjustSize()
        self.token_print.setWordWrap(True)

    def prefix_ui(self):
        self.clear_layout(self.rbox)
        self.clear_layout(self.hbox)
        self.hbox.addStretch()
        self.l1.setText("Input your desired prefix")

        self.rbox.insertSpacing(1, 30)
        self.prefix_print = QLabel(self)
        self.prefix_print.setText(
            'Prefix will be set to: <font color="#ff0000">!</font>'
            '<br>You would execute the help command by typing: '
            '<font color="#ff0000">!help</font>')
        self.prefix_print.setWordWrap(True)
        self.rbox.addWidget(self.prefix_print, 0, Qt.AlignTop)
        self.prefix_edit = QLineEdit(self)
        self.prefix_edit.setPlaceholderText("!")
        self.prefix_edit.setMaximumWidth(300)
        self.rbox.addWidget(self.prefix_edit, 0, Qt.AlignTop)

        l2 = QLabel(self)
        l2.setText('\nPrefixes are referred to in the bot with [p]. '
                   '\nAny time you see [p], replace it with your prefix.')
        self.rbox.addWidget(l2, 0, Qt.AlignCenter)

        matches = [a for a in self.settings.prefixes]
        if len(matches) > 0:
            prefixes = ', '.join(self.settings.prefixes)
            if len(matches) == 1:
                plural = "</font>\nis your current prefix."
            elif len(matches) > 1:
                plural = "</font>\nare your current prefixes."
            l5 = QLabel(self)
            l5.setText('<font color="#ff0000">' + prefixes + plural)
            self.rbox.addWidget(l5, 1, Qt.AlignBottom)
            b5 = QPushButton("Skip", self)
            b5.setMaximumWidth(50)
            self.rbox.addWidget(b5, 0, Qt.AlignBottom)
            b5.clicked.connect(self.admin_ui)

        # buttons
        self.buttons_panel()

        # binds
        self.prefix_edit.textChanged[str].connect(self.prefix_on_change)
        self.b1.setEnabled(True)
        self.b1.clicked.connect(self.token_ui)
        self.b2.clicked.connect(self.prefix_save)
        self.b3.clicked.connect(self.close_prompt)

    def prefix_save(self):
        prefix = str(self.prefix_edit.text())
        if prefix is "":
            prefix = "!"
        self.settings.prefixes.append(prefix)
        self.admin_ui()

    def prefix_on_change(self, text):
        if text is "":
            text = "!"
        self.prefix_print.setText(
            'Prefix will be set to: <font color="#ff0000">' + text +
            '</font><br>You would execute the help command by typing: <font color="#ff0000">'
            + text + 'help</font>')

    def admin_ui(self):
        self.clear_layout(self.rbox)
        self.clear_layout(self.hbox)
        self.hbox.addStretch()
        self.l1.setText("Set your Administrator roles")

        # admin
        self.rbox.insertSpacing(1, 30)
        self.admin_print = QLabel(self)
        self.admin_print.setText("Admin: ")
        self.admin_print.setWordWrap(True)
        self.rbox.addWidget(self.admin_print, 0, Qt.AlignTop)
        self.admin_edit = QLineEdit(self)
        self.admin_edit.setPlaceholderText("Blank for default")
        self.admin_edit.setMaximumWidth(300)
        self.rbox.addWidget(self.admin_edit, 0, Qt.AlignTop)

        # mod
        self.rbox.insertSpacing(1, 30)
        self.mod_print = QLabel(self)
        self.mod_print.setText("Mod: ")
        self.mod_print.setWordWrap(True)
        self.rbox.addWidget(self.mod_print, 0, Qt.AlignTop)
        self.mod_edit = QLineEdit(self)
        self.mod_edit.setPlaceholderText("Blank for default")
        self.mod_edit.setMaximumWidth(300)
        self.rbox.addWidget(self.mod_edit, 0, Qt.AlignTop)

        # buttons
        self.buttons_panel()

        # binds
        self.b2.setText("Finish")
        self.b1.clicked.connect(self.prefix_ui)
        self.b2.clicked.connect(self.admin_save)
        self.b3.clicked.connect(self.close_prompt)

    def admin_save(self):
        admin = self.admin_edit.text()
        mod = self.mod_edit.text()
        if admin is "":
            admin = "Transistor"
        if mod is "":
            mod = "Process"
        self.settings.default_admin = admin
        self.settings.default_mod = mod
        self.finish_prompt()

    def clear_layout(self, layout):
        if layout is not None:
            while layout.count():
                item = layout.takeAt(0)
                widget = item.widget()
                if widget is not None:
                    widget.deleteLater()
                else:
                    self.clear_layout(item.layout())

    def close_prompt(self):
        cbox = QMessageBox.warning(
            self, "Info", "Are you sure you want to cancel Red setup?",
            QMessageBox.Yes, QMessageBox.No)
        if cbox == QMessageBox.Yes:
            self.close()
        else:
            return

    def finish_prompt(self):
        QMessageBox.information(self, "Done!", "Red has been configured.",
                                QMessageBox.Ok)
        self.settings.save_settings()
        self.close()

    def switch_window(self, window):
        self.window = window
        self.hide()
        self.window.show()