diff --git a/README.md b/README.md
index 798b52b..f3837a3 100644
--- a/README.md
+++ b/README.md
@@ -6,6 +6,7 @@ Cog Function
| --- | --- | --- |
| ccrole | **Beta** | Create custom commands that also assign roles
May have some bugs, please create an issue if you find any |
| chatter | **Alpha** | Chat-bot trained to talk like your guild
Missing some key features, but currently functional |
+| coglint | **Alpha** | Error check code in python syntax posted to discord
Works, but probably needs more turning to work for cogs |
| fight | **Incomplete** | Organize bracket tournaments within discord
Still in-progress, a massive project |
| flag | **Incomplete** | Create temporary marks on users that expire after specified time
Not yet ported to v3 |
| hangman | **Alpha** | Play a game of hangman
Some visual glitches and needs more customization |
diff --git a/coglint/__init__.py b/coglint/__init__.py
new file mode 100644
index 0000000..87f61bb
--- /dev/null
+++ b/coglint/__init__.py
@@ -0,0 +1,5 @@
+from .coglint import CogLint
+
+
+def setup(bot):
+ bot.add_cog(CogLint(bot))
diff --git a/coglint/coglint.py b/coglint/coglint.py
new file mode 100644
index 0000000..cf93402
--- /dev/null
+++ b/coglint/coglint.py
@@ -0,0 +1,88 @@
+import discord
+from discord.ext import commands
+from redbot.core import Config, checks, RedContext
+
+from redbot.core.bot import Red
+
+from pylint import epylint as lint
+from redbot.core.data_manager import cog_data_path
+
+
+class CogLint:
+ """
+ V3 Cog Template
+ """
+
+ def __init__(self, bot: Red):
+ self.bot = bot
+ self.config = Config.get_conf(self, identifier=9811198108111121, force_registration=True)
+ default_global = {
+ "lint": True
+ }
+ default_guild = {}
+
+ self.path = str(cog_data_path(self)).replace('\\', '/')
+
+ self.do_lint = None
+ self.counter = 0
+
+ # self.answer_path = self.path + "/tmpfile.py"
+
+ self.config.register_global(**default_global)
+ self.config.register_guild(**default_guild)
+
+ @commands.command()
+ async def autolint(self, ctx: RedContext):
+ """Toggles automatically linting code"""
+ curr = await self.config.lint()
+
+ self.do_lint = not curr
+ await self.config.lint.set(not curr)
+ await ctx.send("Autolinting is now set to {}".format(not curr))
+
+ @commands.command()
+ async def lint(self, ctx: RedContext, *, code):
+ """Lint python code
+
+ Toggle autolinting with `[p]autolint`
+ """
+ await self.lint_message(ctx.message)
+ await ctx.send("Hello World")
+
+ async def lint_code(self, code):
+ self.counter += 1
+ path = self.path + "/{}.py".format(self.counter)
+ with open(path, 'w') as codefile:
+ codefile.write(code)
+
+ future = await self.bot.loop.run_in_executor(None, lint.py_run, path, 'return_std=True')
+
+ if future:
+ (pylint_stdout, pylint_stderr) = future
+ else:
+ (pylint_stdout, pylint_stderr) = None, None
+
+ # print(pylint_stderr)
+ # print(pylint_stdout)
+
+ return pylint_stdout, pylint_stderr
+
+ async def lint_message(self, message):
+ if self.do_lint is None:
+ self.do_lint = await self.config.lint()
+ if not self.do_lint:
+ return
+ code_blocks = message.content.split('```')[1::2]
+
+ for c in code_blocks:
+ is_python, code = c.split(None, 1)
+ is_python = is_python.lower() == 'python'
+ if is_python: # Then we're in business
+ linted, errors = await self.lint_code(code)
+ linted = linted.getvalue()
+ errors = errors.getvalue()
+ await message.channel.send(linted)
+ # await message.channel.send(errors)
+
+ async def on_message(self, message: discord.Message):
+ await self.lint_message(message)
diff --git a/coglint/info..json b/coglint/info..json
new file mode 100644
index 0000000..709c9eb
--- /dev/null
+++ b/coglint/info..json
@@ -0,0 +1,20 @@
+{
+ "author": [
+ "Bobloy"
+ ],
+ "bot_version": [
+ 3,
+ 0,
+ 0
+ ],
+ "description": "Lint python code posted in chat",
+ "hidden": true,
+ "install_msg": "Thank you for installing CogLint",
+ "requirements": [],
+ "short": "Python cog linter",
+ "tags": [
+ "bobloy",
+ "utils",
+ "tools"
+ ]
+}
\ No newline at end of file