diff --git a/src/cogs/git.py b/src/cogs/git.py index dc4e82f..901bbd2 100644 --- a/src/cogs/git.py +++ b/src/cogs/git.py @@ -30,7 +30,7 @@ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. import discord from discord.ext import commands import logging -from .imports.utils import paginate, run_command +from ..shared_libs.utils import paginate, run_command import asyncio git_log = logging.getLogger('git') @@ -53,16 +53,19 @@ class Git: title=f'Git Pull', color=self.bot.embed_color) em.set_thumbnail(url=f'{ctx.guild.me.avatar_url}') - result = await asyncio.wait_for(self.bot.loop.create_task(run_command('git fetch --all')), 120) + '\n' - result += await asyncio.wait_for(self.bot.loop.create_task(run_command('git reset --hard ' - 'origin/$(git ' - 'rev-parse --symbolic-full-name ' - '--abbrev-ref HEAD)')), 120) + '\n\n' - result += await asyncio.wait_for(self.bot.loop.create_task(run_command('git show --stat | ' - 'sed "s/.*@.*[.].*/ /g"')), 10) + + result = await asyncio.wait_for(self.bot.loop.create_task( + run_command('git fetch --all')), 120) + '\n' + result += await asyncio.wait_for(self.bot.loop.create_task( + run_command('git reset --hard origin/$(git rev-parse ' + '--symbolic-full-name --abbrev-ref HEAD)')), + 120) + '\n\n' + result += await asyncio.wait_for(self.bot.loop.create_task( + run_command('git show --stat | sed "s/.*@.*[.].*/ /g"')), 10) + results = paginate(result, maxlen=1014) for page in results[:5]: - em.add_field(name='￲', value=f'{page}') + em.add_field(name='\uFFF0', value=f'{page}') await ctx.send(embed=em) @git.command() @@ -72,12 +75,13 @@ class Git: title=f'Git Pull', color=self.bot.embed_color) em.set_thumbnail(url=f'{ctx.guild.me.avatar_url}') - result = await asyncio.wait_for(self.bot.loop.create_task(run_command('git status')), 10) + result = await asyncio.wait_for(self.bot.loop.create_task( + run_command('git status')), 10) results = paginate(result, maxlen=1014) for page in results[:5]: - em.add_field(name='￲', value=f'{page}') + em.add_field(name='\uFFF0', value=f'{page}') await ctx.send(embed=em) def setup(bot): - bot.add_cog(Git(bot)) \ No newline at end of file + bot.add_cog(Git(bot)) diff --git a/src/shared_libs/utils.py b/src/shared_libs/utils.py new file mode 100644 index 0000000..47a8ff4 --- /dev/null +++ b/src/shared_libs/utils.py @@ -0,0 +1,113 @@ +""" +=== + +MIT License + +Copyright (c) 2018 Dusty.P https://github.com/dustinpianalto + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +""" + + +from io import StringIO +import sys +import asyncio +import discord +from discord.ext.commands.formatter import Paginator +import numpy as np + + +class Capturing(list): + def __enter__(self): + self._stdout = sys.stdout + sys.stdout = self._stringio = StringIO() + return self + + def __exit__(self, *args): + self.extend(self._stringio.getvalue().splitlines()) + del self._stringio # free up some memory + sys.stdout = self._stdout + + +def to_list_of_str(items, out: list=list(), level=1, recurse=0): + def rec_loop(item, key, out, level): + quote = '"' + if type(item) == list: + out.append(f'{" "*level}{quote+key+quote+": " if key else ""}[') + new_level = level + 1 + out = to_list_of_str(item, out, new_level, 1) + out.append(f'{" "*level}]') + elif type(item) == dict: + out.append(f'{" "*level}{quote+key+quote+": " if key else ""}{{') + new_level = level + 1 + out = to_list_of_str(item, out, new_level, 1) + out.append(f'{" "*level}}}') + else: + out.append(f'{" "*level}{quote+key+quote+": " if key else ""}{repr(item)},') + + if type(items) == list: + if not recurse: + out = list() + out.append('[') + for item in items: + rec_loop(item, None, out, level) + if not recurse: + out.append(']') + elif type(items) == dict: + if not recurse: + out = list() + out.append('{') + for key in items: + rec_loop(items[key], key, out, level) + if not recurse: + out.append('}') + + return out + + +def paginate(text, maxlen=1990): + paginator = Paginator(prefix='```py', max_size=maxlen+10) + if type(text) == list: + data = to_list_of_str(text) + elif type(text) == dict: + data = to_list_of_str(text) + else: + data = str(text).split('\n') + for line in data: + if len(line) > maxlen: + n = maxlen + for l in [line[i:i+n] for i in range(0, len(line), n)]: + paginator.add_line(l) + else: + paginator.add_line(line) + return paginator.pages + + +async def run_command(args): + # Create subprocess + process = await asyncio.create_subprocess_shell( + args, + # stdout must a pipe to be accessible as process.stdout + stdout=asyncio.subprocess.PIPE) + # Wait for the subprocess to finish + stdout, stderr = await process.communicate() + # Return stdout + return stdout.decode().strip() \ No newline at end of file