mirror of
https://github.com/Paillat-dev/Botator.git
synced 2026-01-02 01:06:19 +00:00
[GENERAL] Code reformatting using Black standard
This commit is contained in:
33
code/code.py
33
code/code.py
@@ -1,13 +1,12 @@
|
|||||||
#coucou c'est fives
|
import discord # discord.py
|
||||||
# wesh wesh ici latouff
|
|
||||||
import discord # pip install pycord
|
|
||||||
from discord import Intents
|
from discord import Intents
|
||||||
import cogs # import the cogs
|
import cogs # import the cogs
|
||||||
from config import debug, discord_token
|
from config import debug, discord_token
|
||||||
#add the message content intent to the bot, aka discord.Intents.default() and discord.Intents.message_content
|
|
||||||
|
# add the message content intent to the bot, aka discord.Intents.default() and discord.Intents.message_content
|
||||||
intents = discord.Intents.default()
|
intents = discord.Intents.default()
|
||||||
intents.message_content = True
|
intents.message_content = True
|
||||||
bot = discord.Bot(intents=intents, help_command=None) # create the bot
|
bot = discord.Bot(intents=intents, help_command=None) # create the bot
|
||||||
bot.add_cog(cogs.Setup(bot))
|
bot.add_cog(cogs.Setup(bot))
|
||||||
bot.add_cog(cogs.Settings(bot))
|
bot.add_cog(cogs.Settings(bot))
|
||||||
bot.add_cog(cogs.Help(bot))
|
bot.add_cog(cogs.Help(bot))
|
||||||
@@ -15,20 +14,32 @@ bot.add_cog(cogs.Chat(bot))
|
|||||||
bot.add_cog(cogs.ManageChat(bot))
|
bot.add_cog(cogs.ManageChat(bot))
|
||||||
bot.add_cog(cogs.Moderation(bot))
|
bot.add_cog(cogs.Moderation(bot))
|
||||||
|
|
||||||
|
|
||||||
@bot.event
|
@bot.event
|
||||||
async def on_ready():
|
async def on_ready():
|
||||||
await bot.change_presence(activity=discord.Activity(type=discord.ActivityType.watching, name="your messages to answer you"))
|
await bot.change_presence(
|
||||||
|
activity=discord.Activity(
|
||||||
|
type=discord.ActivityType.watching, name="your messages to answer you"
|
||||||
|
)
|
||||||
|
)
|
||||||
debug("Bot is ready")
|
debug("Bot is ready")
|
||||||
|
|
||||||
|
|
||||||
bot.run(discord_token) # run the bot
|
bot.run(discord_token) # run the bot
|
||||||
#set the bot's watching status to watcing your messages to answer you
|
|
||||||
|
|
||||||
|
# set the bot's watching status to watcing your messages to answer you
|
||||||
@bot.event
|
@bot.event
|
||||||
async def on_ready():
|
async def on_ready():
|
||||||
await bot.change_presence(activity=discord.Activity(type=discord.ActivityType.watching, name="your messages to answer you"))
|
await bot.change_presence(
|
||||||
|
activity=discord.Activity(
|
||||||
|
type=discord.ActivityType.watching, name="your messages to answer you"
|
||||||
|
)
|
||||||
|
)
|
||||||
debug("Bot is ready")
|
debug("Bot is ready")
|
||||||
|
|
||||||
|
|
||||||
@bot.event
|
@bot.event
|
||||||
async def on_application_command_error(ctx, error):
|
async def on_application_command_error(ctx, error):
|
||||||
debug(error)
|
debug(error)
|
||||||
await ctx.respond(error, ephemeral=True)
|
await ctx.respond(error, ephemeral=True)
|
||||||
|
|||||||
@@ -4,32 +4,47 @@ from config import debug, c, max_uses, cp, conn, connp, webhook_url
|
|||||||
import makeprompt as mp
|
import makeprompt as mp
|
||||||
import aiohttp
|
import aiohttp
|
||||||
|
|
||||||
|
|
||||||
class MyModal(discord.ui.Modal):
|
class MyModal(discord.ui.Modal):
|
||||||
def __init__(self, message):
|
def __init__(self, message):
|
||||||
super().__init__(title="Downvote")
|
super().__init__(title="Downvote")
|
||||||
self.add_item(discord.ui.InputText(label="Reason", style=discord.InputTextStyle.long))
|
self.add_item(
|
||||||
|
discord.ui.InputText(label="Reason", style=discord.InputTextStyle.long)
|
||||||
|
)
|
||||||
self.message = message
|
self.message = message
|
||||||
|
|
||||||
async def callback(self, interaction: discord.Interaction):
|
async def callback(self, interaction: discord.Interaction):
|
||||||
debug("Downvote sent !")
|
debug("Downvote sent !")
|
||||||
embed = discord.Embed(title="Thanks for your feedback !", description="Your downvote has been sent to the developers. Thanks for your help !", color=discord.Color.og_blurple())
|
embed = discord.Embed(
|
||||||
|
title="Thanks for your feedback !",
|
||||||
|
description="Your downvote has been sent to the developers. Thanks for your help !",
|
||||||
|
color=discord.Color.og_blurple(),
|
||||||
|
)
|
||||||
embed.add_field(name="Message", value=self.children[0].value)
|
embed.add_field(name="Message", value=self.children[0].value)
|
||||||
await interaction.response.send_message(embed=embed, ephemeral=True)
|
await interaction.response.send_message(embed=embed, ephemeral=True)
|
||||||
if webhook_url != "" and webhook_url != None:
|
if webhook_url != "" and webhook_url != None:
|
||||||
session = aiohttp.ClientSession()
|
session = aiohttp.ClientSession()
|
||||||
webhook = discord.Webhook.from_url(webhook_url, session=session)
|
webhook = discord.Webhook.from_url(webhook_url, session=session)
|
||||||
embed = discord.Embed(title="Downvote", description=f"Downvote recieved!", color=discord.Color.og_blurple())
|
embed = discord.Embed(
|
||||||
|
title="Downvote",
|
||||||
|
description=f"Downvote recieved!",
|
||||||
|
color=discord.Color.og_blurple(),
|
||||||
|
)
|
||||||
embed.add_field(name="Reason", value=self.children[0].value, inline=True)
|
embed.add_field(name="Reason", value=self.children[0].value, inline=True)
|
||||||
embed.add_field(name="Author", value=interaction.user.mention, inline=True)
|
embed.add_field(name="Author", value=interaction.user.mention, inline=True)
|
||||||
embed.add_field(name="Channel", value=self.message.channel.name, inline=True)
|
embed.add_field(
|
||||||
|
name="Channel", value=self.message.channel.name, inline=True
|
||||||
|
)
|
||||||
embed.add_field(name="Guild", value=self.message.guild.name, inline=True)
|
embed.add_field(name="Guild", value=self.message.guild.name, inline=True)
|
||||||
history = await self.message.channel.history(limit=5, before=self.message).flatten()
|
history = await self.message.channel.history(
|
||||||
|
limit=5, before=self.message
|
||||||
|
).flatten()
|
||||||
history.reverse()
|
history.reverse()
|
||||||
users = []
|
users = []
|
||||||
fake_users = []
|
fake_users = []
|
||||||
for user in history:
|
for user in history:
|
||||||
if user.author not in users:
|
if user.author not in users:
|
||||||
#we anonimize the user, so user1, user2, user3, etc
|
# we anonimize the user, so user1, user2, user3, etc
|
||||||
fake_users.append(f"user{len(fake_users)+1}")
|
fake_users.append(f"user{len(fake_users)+1}")
|
||||||
users.append(user.author)
|
users.append(user.author)
|
||||||
if self.message.author not in users:
|
if self.message.author not in users:
|
||||||
@@ -39,24 +54,39 @@ class MyModal(discord.ui.Modal):
|
|||||||
uname = fake_users[users.index(msg.author)]
|
uname = fake_users[users.index(msg.author)]
|
||||||
|
|
||||||
if len(msg.content) > 1023:
|
if len(msg.content) > 1023:
|
||||||
embed.add_field(name=f"{uname} said", value=msg.content[:1023], inline=False)
|
embed.add_field(
|
||||||
|
name=f"{uname} said", value=msg.content[:1023], inline=False
|
||||||
|
)
|
||||||
else:
|
else:
|
||||||
embed.add_field(name=f"{uname} said", value=msg.content, inline=False)
|
embed.add_field(
|
||||||
|
name=f"{uname} said", value=msg.content, inline=False
|
||||||
|
)
|
||||||
if len(self.message.content) > 1021:
|
if len(self.message.content) > 1021:
|
||||||
uname = fake_users[users.index(self.message.author)]
|
uname = fake_users[users.index(self.message.author)]
|
||||||
embed.add_field(name=f"{uname} said", value="*"+self.message.content[:1021]+"*", inline=False)
|
embed.add_field(
|
||||||
|
name=f"{uname} said",
|
||||||
|
value="*" + self.message.content[:1021] + "*",
|
||||||
|
inline=False,
|
||||||
|
)
|
||||||
else:
|
else:
|
||||||
uname = fake_users[users.index(self.message.author)]
|
uname = fake_users[users.index(self.message.author)]
|
||||||
embed.add_field(name=f"{uname} said", value="*"+self.message.content+"*", inline=False)
|
embed.add_field(
|
||||||
|
name=f"{uname} said",
|
||||||
|
value="*" + self.message.content + "*",
|
||||||
|
inline=False,
|
||||||
|
)
|
||||||
await webhook.send(embed=embed)
|
await webhook.send(embed=embed)
|
||||||
else:
|
else:
|
||||||
debug("Error while sending webhook, probably no webhook is set up in the .env file")
|
debug(
|
||||||
|
"Error while sending webhook, probably no webhook is set up in the .env file"
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
class Chat (discord.Cog) :
|
class Chat(discord.Cog):
|
||||||
def __init__(self, bot: discord.Bot):
|
def __init__(self, bot: discord.Bot):
|
||||||
super().__init__()
|
super().__init__()
|
||||||
self.bot = bot
|
self.bot = bot
|
||||||
|
|
||||||
@discord.Cog.listener()
|
@discord.Cog.listener()
|
||||||
async def on_message(self, message: discord.Message):
|
async def on_message(self, message: discord.Message):
|
||||||
await mp.chat_process(self, message)
|
await mp.chat_process(self, message)
|
||||||
@@ -74,20 +104,20 @@ class Chat (discord.Cog) :
|
|||||||
if message_to_delete.author.id == self.bot.user.id:
|
if message_to_delete.author.id == self.bot.user.id:
|
||||||
await message_to_delete.delete()
|
await message_to_delete.delete()
|
||||||
else:
|
else:
|
||||||
message_to_redo=history[0]
|
message_to_redo = history[0]
|
||||||
await ctx.respond("Message redone !", ephemeral=True)
|
await ctx.respond("Message redone !", ephemeral=True)
|
||||||
await mp.chat_process(self, message_to_redo)
|
await mp.chat_process(self, message_to_redo)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@discord.message_command(name="Downvote", description="Downvote a message")
|
@discord.message_command(name="Downvote", description="Downvote a message")
|
||||||
@commands.cooldown(1, 60, commands.BucketType.user)
|
@commands.cooldown(1, 60, commands.BucketType.user)
|
||||||
async def downvote(self, ctx: discord.ApplicationContext, message: discord.Message):
|
async def downvote(self, ctx: discord.ApplicationContext, message: discord.Message):
|
||||||
if message.author.id == self.bot.user.id:
|
if message.author.id == self.bot.user.id:
|
||||||
modal = MyModal(message)
|
modal = MyModal(message)
|
||||||
await ctx.send_modal(modal)
|
await ctx.send_modal(modal)
|
||||||
else:
|
else:
|
||||||
await ctx.respond("You can't downvote a message that is not from me !", ephemeral=True)
|
await ctx.respond(
|
||||||
|
"You can't downvote a message that is not from me !", ephemeral=True
|
||||||
|
)
|
||||||
|
|
||||||
@downvote.error
|
@downvote.error
|
||||||
async def downvote_error(self, ctx, error):
|
async def downvote_error(self, ctx, error):
|
||||||
@@ -95,4 +125,4 @@ class Chat (discord.Cog) :
|
|||||||
await ctx.respond("You are on cooldown !", ephemeral=True)
|
await ctx.respond("You are on cooldown !", ephemeral=True)
|
||||||
else:
|
else:
|
||||||
debug(error)
|
debug(error)
|
||||||
raise error
|
raise error
|
||||||
|
|||||||
@@ -1,44 +1,109 @@
|
|||||||
import discord
|
import discord
|
||||||
from config import debug
|
from config import debug
|
||||||
|
|
||||||
class Help (discord.Cog) :
|
|
||||||
|
class Help(discord.Cog):
|
||||||
def __init__(self, bot: discord.Bot) -> None:
|
def __init__(self, bot: discord.Bot) -> None:
|
||||||
super().__init__()
|
super().__init__()
|
||||||
self.bot = bot
|
self.bot = bot
|
||||||
|
|
||||||
@discord.slash_command(name="help", description="Show all the commands")
|
@discord.slash_command(name="help", description="Show all the commands")
|
||||||
async def help(self, ctx: discord.ApplicationContext):
|
async def help(self, ctx: discord.ApplicationContext):
|
||||||
debug(f"The user {ctx.author} ran the help command in the channel {ctx.channel} of the guild {ctx.guild}, named {ctx.guild.name}")
|
debug(
|
||||||
embed = discord.Embed(title="Help", description="Here is the help page", color=0x00ff00)
|
f"The user {ctx.author} ran the help command in the channel {ctx.channel} of the guild {ctx.guild}, named {ctx.guild.name}"
|
||||||
|
)
|
||||||
|
embed = discord.Embed(
|
||||||
|
title="Help", description="Here is the help page", color=0x00FF00
|
||||||
|
)
|
||||||
embed.add_field(name="/setup", value="Setup the bot", inline=False)
|
embed.add_field(name="/setup", value="Setup the bot", inline=False)
|
||||||
embed.add_field(name="/enable", value="Enable the bot", inline=False)
|
embed.add_field(name="/enable", value="Enable the bot", inline=False)
|
||||||
embed.add_field(name="/disable", value="Disable the bot", inline=False)
|
embed.add_field(name="/disable", value="Disable the bot", inline=False)
|
||||||
embed.add_field(name="/advanced", value="Set the advanced settings", inline=False)
|
embed.add_field(
|
||||||
embed.add_field(name="/advanced_help", value="Get help about the advanced settings", inline=False)
|
name="/advanced", value="Set the advanced settings", inline=False
|
||||||
embed.add_field(name="/enable_tts", value="Enable the Text To Speech", inline=False)
|
)
|
||||||
embed.add_field(name="/disable_tts", value="Disable the Text To Speech", inline=False)
|
embed.add_field(
|
||||||
embed.add_field(name="/add|remove_channel", value="Add or remove a channel to the list of channels where the bot will answer. Only available on premium guilds", inline=False)
|
name="/advanced_help",
|
||||||
embed.add_field(name="/delete", value="Delete all your data from our server", inline=False)
|
value="Get help about the advanced settings",
|
||||||
embed.add_field(name="/cancel", value="Cancel the last message sent by the bot", inline=False)
|
inline=False,
|
||||||
embed.add_field(name="/default", value="Set the advanced settings to their default values", inline=False)
|
)
|
||||||
|
embed.add_field(
|
||||||
|
name="/enable_tts", value="Enable the Text To Speech", inline=False
|
||||||
|
)
|
||||||
|
embed.add_field(
|
||||||
|
name="/disable_tts", value="Disable the Text To Speech", inline=False
|
||||||
|
)
|
||||||
|
embed.add_field(
|
||||||
|
name="/add|remove_channel",
|
||||||
|
value="Add or remove a channel to the list of channels where the bot will answer. Only available on premium guilds",
|
||||||
|
inline=False,
|
||||||
|
)
|
||||||
|
embed.add_field(
|
||||||
|
name="/delete", value="Delete all your data from our server", inline=False
|
||||||
|
)
|
||||||
|
embed.add_field(
|
||||||
|
name="/cancel",
|
||||||
|
value="Cancel the last message sent by the bot",
|
||||||
|
inline=False,
|
||||||
|
)
|
||||||
|
embed.add_field(
|
||||||
|
name="/default",
|
||||||
|
value="Set the advanced settings to their default values",
|
||||||
|
inline=False,
|
||||||
|
)
|
||||||
embed.add_field(name="/say", value="Say a message", inline=False)
|
embed.add_field(name="/say", value="Say a message", inline=False)
|
||||||
embed.add_field(name="/redo", value="Redo the last message sent by the bot", inline=False)
|
embed.add_field(
|
||||||
embed.add_field(name="/moderation", value="Setup the AI auto-moderation", inline=False)
|
name="/redo", value="Redo the last message sent by the bot", inline=False
|
||||||
embed.add_field(name="/get_toxicity", value="Get the toxicity that the AI would have given to a given message", inline=False)
|
)
|
||||||
|
embed.add_field(
|
||||||
|
name="/moderation", value="Setup the AI auto-moderation", inline=False
|
||||||
|
)
|
||||||
|
embed.add_field(
|
||||||
|
name="/get_toxicity",
|
||||||
|
value="Get the toxicity that the AI would have given to a given message",
|
||||||
|
inline=False,
|
||||||
|
)
|
||||||
embed.add_field(name="/help", value="Show this message", inline=False)
|
embed.add_field(name="/help", value="Show this message", inline=False)
|
||||||
#add a footer
|
# add a footer
|
||||||
embed.set_footer(text="Made by @Paillat#7777")
|
embed.set_footer(text="Made by @Paillat#7777")
|
||||||
await ctx.respond(embed=embed, ephemeral=True)
|
await ctx.respond(embed=embed, ephemeral=True)
|
||||||
|
|
||||||
@discord.slash_command(name="advanced_help", description="Show the advanced settings meanings")
|
@discord.slash_command(
|
||||||
|
name="advanced_help", description="Show the advanced settings meanings"
|
||||||
|
)
|
||||||
async def advanced_help(self, ctx: discord.ApplicationContext):
|
async def advanced_help(self, ctx: discord.ApplicationContext):
|
||||||
debug(f"The user {ctx.author} ran the advanced_help command in the channel {ctx.channel} of the guild {ctx.guild}, named {ctx.guild.name}")
|
debug(
|
||||||
embed = discord.Embed(title="Advanced Help", description="Here is the advanced help page", color=0x00ff00)
|
f"The user {ctx.author} ran the advanced_help command in the channel {ctx.channel} of the guild {ctx.guild}, named {ctx.guild.name}"
|
||||||
embed.add_field(name="temperature", value="The higher the temperature, the more likely the model will take risks. Conversely, a lower temperature will make the model more conservative. The default value is 0.9", inline=False)
|
)
|
||||||
embed.add_field(name="max_tokens", value="The maximum number of tokens to generate. Higher values will result in more coherent text, but will take longer to complete. (default: 50). **Lower values will result in somentimes cutting off the end of the answer, but will be faster.**", inline=False)
|
embed = discord.Embed(
|
||||||
embed.add_field(name="frequency_penalty", value="The higher the frequency penalty, the more new words the model will introduce (default: 0.0)", inline=False)
|
title="Advanced Help",
|
||||||
embed.add_field(name="presence_penalty", value="The higher the presence penalty, the more new words the model will introduce (default: 0.0)", inline=False)
|
description="Here is the advanced help page",
|
||||||
embed.add_field(name="prompt_size", value="The number of messages to use as a prompt (default: 5). The more messages, the more coherent the text will be, but the more it will take to generate and the more it will cost.", inline=False)
|
color=0x00FF00,
|
||||||
#add a footer
|
)
|
||||||
|
embed.add_field(
|
||||||
|
name="temperature",
|
||||||
|
value="The higher the temperature, the more likely the model will take risks. Conversely, a lower temperature will make the model more conservative. The default value is 0.9",
|
||||||
|
inline=False,
|
||||||
|
)
|
||||||
|
embed.add_field(
|
||||||
|
name="max_tokens",
|
||||||
|
value="The maximum number of tokens to generate. Higher values will result in more coherent text, but will take longer to complete. (default: 50). **Lower values will result in somentimes cutting off the end of the answer, but will be faster.**",
|
||||||
|
inline=False,
|
||||||
|
)
|
||||||
|
embed.add_field(
|
||||||
|
name="frequency_penalty",
|
||||||
|
value="The higher the frequency penalty, the more new words the model will introduce (default: 0.0)",
|
||||||
|
inline=False,
|
||||||
|
)
|
||||||
|
embed.add_field(
|
||||||
|
name="presence_penalty",
|
||||||
|
value="The higher the presence penalty, the more new words the model will introduce (default: 0.0)",
|
||||||
|
inline=False,
|
||||||
|
)
|
||||||
|
embed.add_field(
|
||||||
|
name="prompt_size",
|
||||||
|
value="The number of messages to use as a prompt (default: 5). The more messages, the more coherent the text will be, but the more it will take to generate and the more it will cost.",
|
||||||
|
inline=False,
|
||||||
|
)
|
||||||
|
# add a footer
|
||||||
embed.set_footer(text="Made by @Paillat#7777")
|
embed.set_footer(text="Made by @Paillat#7777")
|
||||||
await ctx.respond(embed=embed, ephemeral=True)
|
await ctx.respond(embed=embed, ephemeral=True)
|
||||||
|
|||||||
@@ -3,72 +3,116 @@ import re
|
|||||||
import os
|
import os
|
||||||
from config import debug, c
|
from config import debug, c
|
||||||
|
|
||||||
class ManageChat (discord.Cog):
|
|
||||||
|
class ManageChat(discord.Cog):
|
||||||
def __init__(self, bot: discord.Bot) -> None:
|
def __init__(self, bot: discord.Bot) -> None:
|
||||||
super().__init__()
|
super().__init__()
|
||||||
self.bot = bot
|
self.bot = bot
|
||||||
|
|
||||||
@discord.slash_command(name="cancel", description="Cancel the last message sent into a channel")
|
@discord.slash_command(
|
||||||
|
name="cancel", description="Cancel the last message sent into a channel"
|
||||||
|
)
|
||||||
async def cancel(self, ctx: discord.ApplicationContext):
|
async def cancel(self, ctx: discord.ApplicationContext):
|
||||||
debug(f"The user {ctx.author} ran the cancel command in the channel {ctx.channel} of the guild {ctx.guild}, named {ctx.guild.name}")
|
debug(
|
||||||
#check if the guild is in the database
|
f"The user {ctx.author} ran the cancel command in the channel {ctx.channel} of the guild {ctx.guild}, named {ctx.guild.name}"
|
||||||
|
)
|
||||||
|
# check if the guild is in the database
|
||||||
c.execute("SELECT * FROM data WHERE guild_id = ?", (ctx.guild.id,))
|
c.execute("SELECT * FROM data WHERE guild_id = ?", (ctx.guild.id,))
|
||||||
if c.fetchone() is None:
|
if c.fetchone() is None:
|
||||||
await ctx.respond("This server is not setup, please run /setup", ephemeral=True)
|
await ctx.respond(
|
||||||
|
"This server is not setup, please run /setup", ephemeral=True
|
||||||
|
)
|
||||||
return
|
return
|
||||||
#get the last message sent by the bot in the cha where the command was sent
|
# get the last message sent by the bot in the cha where the command was sent
|
||||||
last_message = await ctx.channel.fetch_message(ctx.channel.last_message_id)
|
last_message = await ctx.channel.fetch_message(ctx.channel.last_message_id)
|
||||||
#delete the message
|
# delete the message
|
||||||
await last_message.delete()
|
await last_message.delete()
|
||||||
await ctx.respond("The last message has been deleted", ephemeral=True)
|
await ctx.respond("The last message has been deleted", ephemeral=True)
|
||||||
|
|
||||||
#add a slash command called "clear" that deletes all the messages in the channel
|
# add a slash command called "clear" that deletes all the messages in the channel
|
||||||
@discord.slash_command(name="clear", description="Clear all the messages in the channel")
|
@discord.slash_command(
|
||||||
|
name="clear", description="Clear all the messages in the channel"
|
||||||
|
)
|
||||||
async def clear(self, ctx: discord.ApplicationContext):
|
async def clear(self, ctx: discord.ApplicationContext):
|
||||||
debug(f"The user {ctx.author.name} ran the clear command command in the channel {ctx.channel} of the guild {ctx.guild}, named {ctx.guild.name}")
|
debug(
|
||||||
|
f"The user {ctx.author.name} ran the clear command command in the channel {ctx.channel} of the guild {ctx.guild}, named {ctx.guild.name}"
|
||||||
|
)
|
||||||
await ctx.respond("messages deleted!", ephemeral=True)
|
await ctx.respond("messages deleted!", ephemeral=True)
|
||||||
return await ctx.channel.purge()
|
return await ctx.channel.purge()
|
||||||
|
|
||||||
@discord.slash_command(name="transcript", description="Get a transcript of the messages that have been sent in this channel intoa text file")
|
@discord.slash_command(
|
||||||
@discord.option(name="channel_send", description="The channel to send the transcript to", required=False)
|
name="transcript",
|
||||||
async def transcript(self, ctx: discord.ApplicationContext, channel_send: discord.TextChannel = None):
|
description="Get a transcript of the messages that have been sent in this channel intoa text file",
|
||||||
debug(f"The user {ctx.author.name} ran the transcript command command in the channel {ctx.channel} of the guild {ctx.guild}, named {ctx.guild.name}")
|
)
|
||||||
#save all the messages in the channel in a txt file and send it
|
@discord.option(
|
||||||
|
name="channel_send",
|
||||||
|
description="The channel to send the transcript to",
|
||||||
|
required=False,
|
||||||
|
)
|
||||||
|
async def transcript(
|
||||||
|
self, ctx: discord.ApplicationContext, channel_send: discord.TextChannel = None
|
||||||
|
):
|
||||||
|
debug(
|
||||||
|
f"The user {ctx.author.name} ran the transcript command command in the channel {ctx.channel} of the guild {ctx.guild}, named {ctx.guild.name}"
|
||||||
|
)
|
||||||
|
# save all the messages in the channel in a txt file and send it
|
||||||
messages = await ctx.channel.history(limit=None).flatten()
|
messages = await ctx.channel.history(limit=None).flatten()
|
||||||
messages.reverse()
|
messages.reverse()
|
||||||
transcript = ""
|
transcript = ""
|
||||||
#defer the response
|
# defer the response
|
||||||
await ctx.defer() #defer the response so that the bot doesn't say that it's thinking
|
await ctx.defer() # defer the response so that the bot doesn't say that it's thinking
|
||||||
for msg in messages:
|
for msg in messages:
|
||||||
if msg.author.bot:
|
if msg.author.bot:
|
||||||
transcript += f"Botator: {msg.content}\n"
|
transcript += f"Botator: {msg.content}\n"
|
||||||
else:
|
else:
|
||||||
mentions = re.findall(r"<@!?\d+>", msg.content)
|
mentions = re.findall(r"<@!?\d+>", msg.content)
|
||||||
#then replace each mention with the name of the user
|
# then replace each mention with the name of the user
|
||||||
for mention in mentions:
|
for mention in mentions:
|
||||||
#get the user id
|
# get the user id
|
||||||
id = mention[2:-1]
|
id = mention[2:-1]
|
||||||
#get the user
|
# get the user
|
||||||
user = await self.bot.fetch_user(id)
|
user = await self.bot.fetch_user(id)
|
||||||
#replace the mention with the name
|
# replace the mention with the name
|
||||||
msg.content = msg.content.replace(mention, msg.guild.get_member(user.id).name)
|
msg.content = msg.content.replace(
|
||||||
|
mention, msg.guild.get_member(user.id).name
|
||||||
|
)
|
||||||
transcript += f"{msg.author.name}: {msg.content}\n"
|
transcript += f"{msg.author.name}: {msg.content}\n"
|
||||||
#save the transcript in a txt file called transcript.txt. If the file already exists, delete it and create a new one
|
# save the transcript in a txt file called transcript.txt. If the file already exists, delete it and create a new one
|
||||||
#check if the file exists
|
# check if the file exists
|
||||||
if os.path.exists("transcript.txt"):
|
if os.path.exists("transcript.txt"):
|
||||||
os.remove("transcript.txt")
|
os.remove("transcript.txt")
|
||||||
f = open("transcript.txt", "w")
|
f = open("transcript.txt", "w")
|
||||||
f.write(transcript)
|
f.write(transcript)
|
||||||
f.close()
|
f.close()
|
||||||
last_message: discord.Message = await ctx.channel.fetch_message(ctx.channel.last_message_id)
|
last_message: discord.Message = await ctx.channel.fetch_message(
|
||||||
#rename the file with the name of the channel and the date in this format: transcript_servername_channelname_dd-month-yyyy.txt ex : transcript_Botator_Testing_12-may-2021.txt
|
ctx.channel.last_message_id
|
||||||
os.rename("transcript.txt", f"transcript_{ctx.guild.name}_{ctx.channel.name}_{last_message.created_at.strftime('%d-%B-%Y')}.txt")
|
)
|
||||||
#send the file in a private message to the user who ran the command
|
# rename the file with the name of the channel and the date in this format: transcript_servername_channelname_dd-month-yyyy.txt ex : transcript_Botator_Testing_12-may-2021.txt
|
||||||
|
os.rename(
|
||||||
|
"transcript.txt",
|
||||||
|
f"transcript_{ctx.guild.name}_{ctx.channel.name}_{last_message.created_at.strftime('%d-%B-%Y')}.txt",
|
||||||
|
)
|
||||||
|
# send the file in a private message to the user who ran the command
|
||||||
if channel_send is None:
|
if channel_send is None:
|
||||||
await ctx.respond(file=discord.File(f"transcript_{ctx.guild.name}_{ctx.channel.name}_{last_message.created_at.strftime('%d-%B-%Y')}.txt"), ephemeral=True)
|
await ctx.respond(
|
||||||
|
file=discord.File(
|
||||||
|
f"transcript_{ctx.guild.name}_{ctx.channel.name}_{last_message.created_at.strftime('%d-%B-%Y')}.txt"
|
||||||
|
),
|
||||||
|
ephemeral=True,
|
||||||
|
)
|
||||||
else:
|
else:
|
||||||
await channel_send.send(file=discord.File(f"transcript_{ctx.guild.name}_{ctx.channel.name}_{last_message.created_at.strftime('%d-%B-%Y')}.txt"))
|
await channel_send.send(
|
||||||
|
file=discord.File(
|
||||||
|
f"transcript_{ctx.guild.name}_{ctx.channel.name}_{last_message.created_at.strftime('%d-%B-%Y')}.txt"
|
||||||
|
)
|
||||||
|
)
|
||||||
await ctx.respond("Transcript sent!", ephemeral=True, delete_after=5)
|
await ctx.respond("Transcript sent!", ephemeral=True, delete_after=5)
|
||||||
await ctx.author.send(file=discord.File(f"transcript_{ctx.guild.name}_{ctx.channel.name}_{last_message.created_at.strftime('%d-%B-%Y')}.txt"))
|
await ctx.author.send(
|
||||||
#delete the file
|
file=discord.File(
|
||||||
os.remove(f"transcript_{ctx.guild.name}_{ctx.channel.name}_{last_message.created_at.strftime('%d-%B-%Y')}.txt")
|
f"transcript_{ctx.guild.name}_{ctx.channel.name}_{last_message.created_at.strftime('%d-%B-%Y')}.txt"
|
||||||
|
)
|
||||||
|
)
|
||||||
|
# delete the file
|
||||||
|
os.remove(
|
||||||
|
f"transcript_{ctx.guild.name}_{ctx.channel.name}_{last_message.created_at.strftime('%d-%B-%Y')}.txt"
|
||||||
|
)
|
||||||
|
|||||||
@@ -4,30 +4,82 @@ import os
|
|||||||
from config import debug, c, conn
|
from config import debug, c, conn
|
||||||
import openai
|
import openai
|
||||||
import requests
|
import requests
|
||||||
import toxicity as tox #this is a file called toxicity.py, which contains the toxicity function that allows you to check if a message is toxic or not (it uses the perspective api)
|
import toxicity as tox # this is a file called toxicity.py, which contains the toxicity function that allows you to check if a message is toxic or not (it uses the perspective api)
|
||||||
class Moderation (discord.Cog):
|
|
||||||
|
|
||||||
|
class Moderation(discord.Cog):
|
||||||
def __init__(self, bot: discord.Bot) -> None:
|
def __init__(self, bot: discord.Bot) -> None:
|
||||||
super().__init__()
|
super().__init__()
|
||||||
self.bot = bot
|
self.bot = bot
|
||||||
@discord.slash_command(name="moderation", description="Enable or disable AI moderation & set the rules")
|
|
||||||
@discord.option(name="enable", description="Enable or disable AI moderation", reqired=True,)
|
@discord.slash_command(
|
||||||
@discord.option(name="log_channel", description="The channel where the moderation logs will be sent", required=True)
|
name="moderation", description="Enable or disable AI moderation & set the rules"
|
||||||
@discord.option(name="moderator_role", description="The role of the moderators", required=True)
|
)
|
||||||
#the types of toxicity are 'requestedAttributes': {'TOXICITY': {}, 'SEVERE_TOXICITY': {}, 'IDENTITY_ATTACK': {}, 'INSULT': {}, 'PROFANITY': {}, 'THREAT': {}, 'SEXUALLY_EXPLICIT': {}, 'FLIRTATION': {}, 'OBSCENE': {}, 'SPAM': {}},
|
@discord.option(
|
||||||
@discord.option(name="toxicity", description="The toxicity threshold", required=False)
|
name="enable",
|
||||||
@discord.option(name="severe_toxicity", description="The severe toxicity threshold", required=False)
|
description="Enable or disable AI moderation",
|
||||||
@discord.option(name="identity_attack", description="The identity attack threshold", required=False)
|
reqired=True,
|
||||||
|
)
|
||||||
|
@discord.option(
|
||||||
|
name="log_channel",
|
||||||
|
description="The channel where the moderation logs will be sent",
|
||||||
|
required=True,
|
||||||
|
)
|
||||||
|
@discord.option(
|
||||||
|
name="moderator_role", description="The role of the moderators", required=True
|
||||||
|
)
|
||||||
|
# the types of toxicity are 'requestedAttributes': {'TOXICITY': {}, 'SEVERE_TOXICITY': {}, 'IDENTITY_ATTACK': {}, 'INSULT': {}, 'PROFANITY': {}, 'THREAT': {}, 'SEXUALLY_EXPLICIT': {}, 'FLIRTATION': {}, 'OBSCENE': {}, 'SPAM': {}},
|
||||||
|
@discord.option(
|
||||||
|
name="toxicity", description="The toxicity threshold", required=False
|
||||||
|
)
|
||||||
|
@discord.option(
|
||||||
|
name="severe_toxicity",
|
||||||
|
description="The severe toxicity threshold",
|
||||||
|
required=False,
|
||||||
|
)
|
||||||
|
@discord.option(
|
||||||
|
name="identity_attack",
|
||||||
|
description="The identity attack threshold",
|
||||||
|
required=False,
|
||||||
|
)
|
||||||
@discord.option(name="insult", description="The insult threshold", required=False)
|
@discord.option(name="insult", description="The insult threshold", required=False)
|
||||||
@discord.option(name="profanity", description="The profanity threshold", required=False)
|
@discord.option(
|
||||||
|
name="profanity", description="The profanity threshold", required=False
|
||||||
|
)
|
||||||
@discord.option(name="threat", description="The threat threshold", required=False)
|
@discord.option(name="threat", description="The threat threshold", required=False)
|
||||||
@discord.option(name="sexually_explicit", description="The sexually explicit threshold", required=False)
|
@discord.option(
|
||||||
@discord.option(name="flirtation", description="The flirtation threshold", required=False)
|
name="sexually_explicit",
|
||||||
|
description="The sexually explicit threshold",
|
||||||
|
required=False,
|
||||||
|
)
|
||||||
|
@discord.option(
|
||||||
|
name="flirtation", description="The flirtation threshold", required=False
|
||||||
|
)
|
||||||
@discord.option(name="obscene", description="The obscene threshold", required=False)
|
@discord.option(name="obscene", description="The obscene threshold", required=False)
|
||||||
@discord.option(name="spam", description="The spam threshold", required=False)
|
@discord.option(name="spam", description="The spam threshold", required=False)
|
||||||
#we set the default permissions to the administrator permission, so only the server administrators can use this command
|
# we set the default permissions to the administrator permission, so only the server administrators can use this command
|
||||||
@default_permissions(administrator=True)
|
@default_permissions(administrator=True)
|
||||||
async def moderation(self, ctx: discord.ApplicationContext, enable: bool, log_channel: discord.TextChannel, moderator_role: discord.Role, toxicity: float = None, severe_toxicity: float = None, identity_attack: float = None, insult: float = None, profanity: float = None, threat: float = None, sexually_explicit: float = None, flirtation: float = None, obscene: float = None, spam: float = None):
|
async def moderation(
|
||||||
await ctx.respond("Our moderation capabilities have been switched to our new 100% free and open-source AI discord moderation bot! You add it to your server here: https://discord.com/api/oauth2/authorize?client_id=1071451913024974939&permissions=1377342450896&scope=bot and you can find the source code here: https://github.com/Paillat-dev/Moderator/ \n If you need help, you can join our support server here: https://discord.gg/pB6hXtUeDv", ephemeral=True)
|
self,
|
||||||
|
ctx: discord.ApplicationContext,
|
||||||
|
enable: bool,
|
||||||
|
log_channel: discord.TextChannel,
|
||||||
|
moderator_role: discord.Role,
|
||||||
|
toxicity: float = None,
|
||||||
|
severe_toxicity: float = None,
|
||||||
|
identity_attack: float = None,
|
||||||
|
insult: float = None,
|
||||||
|
profanity: float = None,
|
||||||
|
threat: float = None,
|
||||||
|
sexually_explicit: float = None,
|
||||||
|
flirtation: float = None,
|
||||||
|
obscene: float = None,
|
||||||
|
spam: float = None,
|
||||||
|
):
|
||||||
|
await ctx.respond(
|
||||||
|
"Our moderation capabilities have been switched to our new 100% free and open-source AI discord moderation bot! You add it to your server here: https://discord.com/api/oauth2/authorize?client_id=1071451913024974939&permissions=1377342450896&scope=bot and you can find the source code here: https://github.com/Paillat-dev/Moderator/ \n If you need help, you can join our support server here: https://discord.gg/pB6hXtUeDv",
|
||||||
|
ephemeral=True,
|
||||||
|
)
|
||||||
if enable == False:
|
if enable == False:
|
||||||
c.execute("DELETE FROM moderation WHERE guild_id = ?", (str(ctx.guild.id),))
|
c.execute("DELETE FROM moderation WHERE guild_id = ?", (str(ctx.guild.id),))
|
||||||
conn.commit()
|
conn.commit()
|
||||||
@@ -36,52 +88,107 @@ class Moderation (discord.Cog):
|
|||||||
|
|
||||||
@discord.Cog.listener()
|
@discord.Cog.listener()
|
||||||
async def on_message(self, message: discord.Message):
|
async def on_message(self, message: discord.Message):
|
||||||
if message.author == self.bot.user: return
|
if message.author == self.bot.user:
|
||||||
try: c.execute("SELECT * FROM moderation WHERE guild_id = ?", (str(message.guild.id),))
|
return
|
||||||
except: return
|
try:
|
||||||
|
c.execute(
|
||||||
|
"SELECT * FROM moderation WHERE guild_id = ?", (str(message.guild.id),)
|
||||||
|
)
|
||||||
|
except:
|
||||||
|
return
|
||||||
data = c.fetchone()
|
data = c.fetchone()
|
||||||
if data is None: return
|
if data is None:
|
||||||
|
return
|
||||||
channel = self.bot.get_channel(int(data[1]))
|
channel = self.bot.get_channel(int(data[1]))
|
||||||
is_enabled = data[2]
|
is_enabled = data[2]
|
||||||
moderator_role = message.guild.get_role(int(data[3]))
|
moderator_role = message.guild.get_role(int(data[3]))
|
||||||
#we also do that with the manage_messages permission, so the moderators can't be moderated
|
# we also do that with the manage_messages permission, so the moderators can't be moderated
|
||||||
if message.author.guild_permissions.manage_messages: return #if the user is a moderator, we don't want to moderate him because he is allowed to say whatever he wants because he is just like a dictator
|
if message.author.guild_permissions.manage_messages:
|
||||||
if message.author.guild_permissions.administrator: return #if the user is an administrator, we don't want to moderate him because he is allowed to say whatever he wants because he is a DICTATOR
|
return # if the user is a moderator, we don't want to moderate him because he is allowed to say whatever he wants because he is just like a dictator
|
||||||
if not is_enabled: return
|
if message.author.guild_permissions.administrator:
|
||||||
|
return # if the user is an administrator, we don't want to moderate him because he is allowed to say whatever he wants because he is a DICTATOR
|
||||||
|
if not is_enabled:
|
||||||
|
return
|
||||||
content = message.content
|
content = message.content
|
||||||
message_toxicity = tox.get_toxicity(content)
|
message_toxicity = tox.get_toxicity(content)
|
||||||
reasons_to_delete = []
|
reasons_to_delete = []
|
||||||
reasons_to_suspicous = []
|
reasons_to_suspicous = []
|
||||||
for i in message_toxicity:
|
|
||||||
if i >= float(data[message_toxicity.index(i)+4]): reasons_to_delete.append(tox.toxicity_names[message_toxicity.index(i)])
|
|
||||||
for i in message_toxicity:
|
for i in message_toxicity:
|
||||||
if float(data[message_toxicity.index(i)+4]-0.1) <= i < float(data[message_toxicity.index(i)+4]): reasons_to_suspicous.append(tox.toxicity_names[message_toxicity.index(i)])
|
if i >= float(data[message_toxicity.index(i) + 4]):
|
||||||
|
reasons_to_delete.append(tox.toxicity_names[message_toxicity.index(i)])
|
||||||
|
for i in message_toxicity:
|
||||||
|
if (
|
||||||
|
float(data[message_toxicity.index(i) + 4] - 0.1)
|
||||||
|
<= i
|
||||||
|
< float(data[message_toxicity.index(i) + 4])
|
||||||
|
):
|
||||||
|
reasons_to_suspicous.append(
|
||||||
|
tox.toxicity_names[message_toxicity.index(i)]
|
||||||
|
)
|
||||||
if len(reasons_to_delete) > 0:
|
if len(reasons_to_delete) > 0:
|
||||||
embed = discord.Embed(title="Message deleted", description=f"Your message was deleted because it was too toxic. The following reasons were found: **{'**, **'.join(reasons_to_delete)}**", color=discord.Color.red())
|
embed = discord.Embed(
|
||||||
await message.reply(f"{message.author.mention}", embed=embed, delete_after=15)
|
title="Message deleted",
|
||||||
|
description=f"Your message was deleted because it was too toxic. The following reasons were found: **{'**, **'.join(reasons_to_delete)}**",
|
||||||
|
color=discord.Color.red(),
|
||||||
|
)
|
||||||
|
await message.reply(
|
||||||
|
f"{message.author.mention}", embed=embed, delete_after=15
|
||||||
|
)
|
||||||
await message.delete()
|
await message.delete()
|
||||||
embed = discord.Embed(title="Message deleted", description=f"**{message.author}**'s message ***{content}*** was deleted because it was too toxic. The following reasons were found:", color=discord.Color.red())
|
embed = discord.Embed(
|
||||||
|
title="Message deleted",
|
||||||
|
description=f"**{message.author}**'s message ***{content}*** was deleted because it was too toxic. The following reasons were found:",
|
||||||
|
color=discord.Color.red(),
|
||||||
|
)
|
||||||
for i in reasons_to_delete:
|
for i in reasons_to_delete:
|
||||||
toxicity_value = message_toxicity[tox.toxicity_names.index(i)]
|
toxicity_value = message_toxicity[tox.toxicity_names.index(i)]
|
||||||
embed.add_field(name=i, value=f"Found toxicity value: **{toxicity_value*100}%**", inline=False)
|
embed.add_field(
|
||||||
|
name=i,
|
||||||
|
value=f"Found toxicity value: **{toxicity_value*100}%**",
|
||||||
|
inline=False,
|
||||||
|
)
|
||||||
await channel.send(embed=embed)
|
await channel.send(embed=embed)
|
||||||
elif len(reasons_to_suspicous) > 0:
|
elif len(reasons_to_suspicous) > 0:
|
||||||
await message.reply(f"{moderator_role.mention} This message might be toxic. The following reasons were found: **{'**, **'.join(reasons_to_suspicous)}**", delete_after=15, mention_author=False)
|
await message.reply(
|
||||||
embed = discord.Embed(title="Message suspicious", description=f"**{message.author}**'s message [***{content}***]({message.jump_url}) might be toxic. The following reasons were found:", color=discord.Color.orange())
|
f"{moderator_role.mention} This message might be toxic. The following reasons were found: **{'**, **'.join(reasons_to_suspicous)}**",
|
||||||
|
delete_after=15,
|
||||||
|
mention_author=False,
|
||||||
|
)
|
||||||
|
embed = discord.Embed(
|
||||||
|
title="Message suspicious",
|
||||||
|
description=f"**{message.author}**'s message [***{content}***]({message.jump_url}) might be toxic. The following reasons were found:",
|
||||||
|
color=discord.Color.orange(),
|
||||||
|
)
|
||||||
for i in reasons_to_suspicous:
|
for i in reasons_to_suspicous:
|
||||||
toxicity_value = message_toxicity[tox.toxicity_names.index(i)]
|
toxicity_value = message_toxicity[tox.toxicity_names.index(i)]
|
||||||
embed.add_field(name=i, value=f"Found toxicity value: **{toxicity_value*100}%**", inline=False)
|
embed.add_field(
|
||||||
|
name=i,
|
||||||
|
value=f"Found toxicity value: **{toxicity_value*100}%**",
|
||||||
|
inline=False,
|
||||||
|
)
|
||||||
await channel.send(embed=embed)
|
await channel.send(embed=embed)
|
||||||
#we add a reaction to the message so the moderators can easily find it orange circle emoji
|
# we add a reaction to the message so the moderators can easily find it orange circle emoji
|
||||||
await message.add_reaction("🟠")
|
await message.add_reaction("🟠")
|
||||||
|
|
||||||
@discord.slash_command(name="get_toxicity", description="Get the toxicity of a message")
|
@discord.slash_command(
|
||||||
@discord.option(name="message", description="The message you want to check", required=True)
|
name="get_toxicity", description="Get the toxicity of a message"
|
||||||
|
)
|
||||||
|
@discord.option(
|
||||||
|
name="message", description="The message you want to check", required=True
|
||||||
|
)
|
||||||
@default_permissions(administrator=True)
|
@default_permissions(administrator=True)
|
||||||
async def get_toxicity(self, ctx: discord.ApplicationContext, message: str):
|
async def get_toxicity(self, ctx: discord.ApplicationContext, message: str):
|
||||||
await ctx.respond("Our moderation capabilities have been switched to our new 100% free and open-source AI discord moderation bot! You add it to your server here: https://discord.com/api/oauth2/authorize?client_id=1071451913024974939&permissions=1377342450896&scope=bot and you can find the source code here: https://discord.gg/pB6hXtUeDv . If you need help, you can join our support server here: https://discord.gg/pB6hXtUeDv", ephemeral=True)
|
await ctx.respond(
|
||||||
|
"Our moderation capabilities have been switched to our new 100% free and open-source AI discord moderation bot! You add it to your server here: https://discord.com/api/oauth2/authorize?client_id=1071451913024974939&permissions=1377342450896&scope=bot and you can find the source code here: https://discord.gg/pB6hXtUeDv . If you need help, you can join our support server here: https://discord.gg/pB6hXtUeDv",
|
||||||
|
ephemeral=True,
|
||||||
|
)
|
||||||
|
|
||||||
@discord.slash_command(name="moderation_help", description="Get help with the moderation AI")
|
@discord.slash_command(
|
||||||
|
name="moderation_help", description="Get help with the moderation AI"
|
||||||
|
)
|
||||||
@default_permissions(administrator=True)
|
@default_permissions(administrator=True)
|
||||||
async def moderation_help(self, ctx: discord.ApplicationContext):
|
async def moderation_help(self, ctx: discord.ApplicationContext):
|
||||||
await ctx.respond("Our moderation capabilities have been switched to our new 100% free and open-source AI discord moderation bot! You add it to your server here: https://discord.com/api/oauth2/authorize?client_id=1071451913024974939&permissions=1377342450896&scope=bot and you can find the source code here: https://github.com/Paillat-dev/Moderator/ . If you need help, you can join our support server here: https://discord.gg/pB6hXtUeDv", ephemeral=True)
|
await ctx.respond(
|
||||||
|
"Our moderation capabilities have been switched to our new 100% free and open-source AI discord moderation bot! You add it to your server here: https://discord.com/api/oauth2/authorize?client_id=1071451913024974939&permissions=1377342450896&scope=bot and you can find the source code here: https://github.com/Paillat-dev/Moderator/ . If you need help, you can join our support server here: https://discord.gg/pB6hXtUeDv",
|
||||||
|
ephemeral=True,
|
||||||
|
)
|
||||||
|
|||||||
@@ -2,114 +2,215 @@ import discord
|
|||||||
from config import debug, conn, c, moderate
|
from config import debug, conn, c, moderate
|
||||||
from discord import default_permissions
|
from discord import default_permissions
|
||||||
import openai
|
import openai
|
||||||
|
|
||||||
models = ["davinci", "chatGPT", "gpt-4"]
|
models = ["davinci", "chatGPT", "gpt-4"]
|
||||||
images_recognition = ["enable", "disable"]
|
images_recognition = ["enable", "disable"]
|
||||||
class Settings (discord.Cog) :
|
|
||||||
|
|
||||||
|
class Settings(discord.Cog):
|
||||||
def __init__(self, bot: discord.Bot) -> None:
|
def __init__(self, bot: discord.Bot) -> None:
|
||||||
super().__init__()
|
super().__init__()
|
||||||
self.bot = bot
|
self.bot = bot
|
||||||
|
|
||||||
#create a command called "advanced" that only admins can use, wich sets the advanced settings up: max_tokens, temperature, frequency_penalty, presence_penalty, prompt_size
|
# create a command called "advanced" that only admins can use, wich sets the advanced settings up: max_tokens, temperature, frequency_penalty, presence_penalty, prompt_size
|
||||||
@discord.slash_command(name="advanced", description="Advanced settings")
|
@discord.slash_command(name="advanced", description="Advanced settings")
|
||||||
##@discord.commands.permissions(administrator=True)
|
##@discord.commands.permissions(administrator=True)
|
||||||
#add the options
|
# add the options
|
||||||
@discord.option(name="max_tokens", description="The max tokens", required=False)
|
@discord.option(name="max_tokens", description="The max tokens", required=False)
|
||||||
@discord.option(name="temperature", description="The temperature", required=False)
|
@discord.option(name="temperature", description="The temperature", required=False)
|
||||||
@discord.option(name="frequency_penalty", description="The frequency penalty", required=False)
|
@discord.option(
|
||||||
@discord.option(name="presence_penalty", description="The presence penalty", required=False)
|
name="frequency_penalty", description="The frequency penalty", required=False
|
||||||
|
)
|
||||||
|
@discord.option(
|
||||||
|
name="presence_penalty", description="The presence penalty", required=False
|
||||||
|
)
|
||||||
@discord.option(name="prompt_size", description="The prompt size", required=False)
|
@discord.option(name="prompt_size", description="The prompt size", required=False)
|
||||||
async def advanced(self, ctx: discord.ApplicationContext, max_tokens: int = None, temperature: float = None, frequency_penalty: float = None, presence_penalty: float = None, prompt_size: int = None):
|
async def advanced(
|
||||||
debug(f"The user {ctx.author} ran the advanced command in the channel {ctx.channel} of the guild {ctx.guild}, named {ctx.guild.name}")
|
self,
|
||||||
#check if the guild is in the database
|
ctx: discord.ApplicationContext,
|
||||||
|
max_tokens: int = None,
|
||||||
|
temperature: float = None,
|
||||||
|
frequency_penalty: float = None,
|
||||||
|
presence_penalty: float = None,
|
||||||
|
prompt_size: int = None,
|
||||||
|
):
|
||||||
|
debug(
|
||||||
|
f"The user {ctx.author} ran the advanced command in the channel {ctx.channel} of the guild {ctx.guild}, named {ctx.guild.name}"
|
||||||
|
)
|
||||||
|
# check if the guild is in the database
|
||||||
c.execute("SELECT * FROM data WHERE guild_id = ?", (ctx.guild.id,))
|
c.execute("SELECT * FROM data WHERE guild_id = ?", (ctx.guild.id,))
|
||||||
if c.fetchone() is None:
|
if c.fetchone() is None:
|
||||||
await ctx.respond("This server is not setup", ephemeral=True)
|
await ctx.respond("This server is not setup", ephemeral=True)
|
||||||
return
|
return
|
||||||
#check if the user has entered at least one argument
|
# check if the user has entered at least one argument
|
||||||
if max_tokens is None and temperature is None and frequency_penalty is None and presence_penalty is None and prompt_size is None:
|
if (
|
||||||
|
max_tokens is None
|
||||||
|
and temperature is None
|
||||||
|
and frequency_penalty is None
|
||||||
|
and presence_penalty is None
|
||||||
|
and prompt_size is None
|
||||||
|
):
|
||||||
await ctx.respond("You must enter at least one argument", ephemeral=True)
|
await ctx.respond("You must enter at least one argument", ephemeral=True)
|
||||||
return
|
return
|
||||||
#check if the user has entered valid arguments
|
# check if the user has entered valid arguments
|
||||||
if max_tokens is not None and (max_tokens < 1 or max_tokens > 4000):
|
if max_tokens is not None and (max_tokens < 1 or max_tokens > 4000):
|
||||||
await ctx.respond("Invalid max tokens", ephemeral=True)
|
await ctx.respond("Invalid max tokens", ephemeral=True)
|
||||||
return
|
return
|
||||||
if temperature is not None and (temperature < 0.0 or temperature > 1.0):
|
if temperature is not None and (temperature < 0.0 or temperature > 1.0):
|
||||||
await ctx.respond("Invalid temperature", ephemeral=True)
|
await ctx.respond("Invalid temperature", ephemeral=True)
|
||||||
return
|
return
|
||||||
if frequency_penalty is not None and (frequency_penalty < 0.0 or frequency_penalty > 2.0):
|
if frequency_penalty is not None and (
|
||||||
|
frequency_penalty < 0.0 or frequency_penalty > 2.0
|
||||||
|
):
|
||||||
await ctx.respond("Invalid frequency penalty", ephemeral=True)
|
await ctx.respond("Invalid frequency penalty", ephemeral=True)
|
||||||
return
|
return
|
||||||
if presence_penalty is not None and (presence_penalty < 0.0 or presence_penalty > 2.0):
|
if presence_penalty is not None and (
|
||||||
|
presence_penalty < 0.0 or presence_penalty > 2.0
|
||||||
|
):
|
||||||
await ctx.respond("Invalid presence penalty", ephemeral=True)
|
await ctx.respond("Invalid presence penalty", ephemeral=True)
|
||||||
return
|
return
|
||||||
if prompt_size is not None and (prompt_size < 1 or prompt_size > 10):
|
if prompt_size is not None and (prompt_size < 1 or prompt_size > 10):
|
||||||
await ctx.respond("Invalid prompt size", ephemeral=True)
|
await ctx.respond("Invalid prompt size", ephemeral=True)
|
||||||
return
|
return
|
||||||
if max_tokens is None:
|
if max_tokens is None:
|
||||||
if c.execute("SELECT max_tokens FROM data WHERE guild_id = ?", (ctx.guild.id,)).fetchone()[0] is not None and max_tokens is None:
|
if (
|
||||||
max_tokens = c.execute("SELECT max_tokens FROM data WHERE guild_id = ?", (ctx.guild.id,)).fetchone()[0]
|
c.execute(
|
||||||
|
"SELECT max_tokens FROM data WHERE guild_id = ?", (ctx.guild.id,)
|
||||||
|
).fetchone()[0]
|
||||||
|
is not None
|
||||||
|
and max_tokens is None
|
||||||
|
):
|
||||||
|
max_tokens = c.execute(
|
||||||
|
"SELECT max_tokens FROM data WHERE guild_id = ?", (ctx.guild.id,)
|
||||||
|
).fetchone()[0]
|
||||||
else:
|
else:
|
||||||
max_tokens = 64
|
max_tokens = 64
|
||||||
if temperature is None:
|
if temperature is None:
|
||||||
if c.execute("SELECT temperature FROM data WHERE guild_id = ?", (ctx.guild.id,)).fetchone()[0] is not None and temperature is None:
|
if (
|
||||||
temperature = c.execute("SELECT temperature FROM data WHERE guild_id = ?", (ctx.guild.id,)).fetchone()[0]
|
c.execute(
|
||||||
|
"SELECT temperature FROM data WHERE guild_id = ?", (ctx.guild.id,)
|
||||||
|
).fetchone()[0]
|
||||||
|
is not None
|
||||||
|
and temperature is None
|
||||||
|
):
|
||||||
|
temperature = c.execute(
|
||||||
|
"SELECT temperature FROM data WHERE guild_id = ?", (ctx.guild.id,)
|
||||||
|
).fetchone()[0]
|
||||||
else:
|
else:
|
||||||
temperature = 0.9
|
temperature = 0.9
|
||||||
if frequency_penalty is None:
|
if frequency_penalty is None:
|
||||||
if c.execute("SELECT frequency_penalty FROM data WHERE guild_id = ?", (ctx.guild.id,)).fetchone()[0] is not None and frequency_penalty is None:
|
if (
|
||||||
frequency_penalty = c.execute("SELECT frequency_penalty FROM data WHERE guild_id = ?", (ctx.guild.id,)).fetchone()[0]
|
c.execute(
|
||||||
|
"SELECT frequency_penalty FROM data WHERE guild_id = ?",
|
||||||
|
(ctx.guild.id,),
|
||||||
|
).fetchone()[0]
|
||||||
|
is not None
|
||||||
|
and frequency_penalty is None
|
||||||
|
):
|
||||||
|
frequency_penalty = c.execute(
|
||||||
|
"SELECT frequency_penalty FROM data WHERE guild_id = ?",
|
||||||
|
(ctx.guild.id,),
|
||||||
|
).fetchone()[0]
|
||||||
else:
|
else:
|
||||||
frequency_penalty = 0.0
|
frequency_penalty = 0.0
|
||||||
if presence_penalty is None:
|
if presence_penalty is None:
|
||||||
if c.execute("SELECT presence_penalty FROM data WHERE guild_id = ?", (ctx.guild.id,)).fetchone()[0] is not None and presence_penalty is None:
|
if (
|
||||||
presence_penalty = c.execute("SELECT presence_penalty FROM data WHERE guild_id = ?", (ctx.guild.id,)).fetchone()[0]
|
c.execute(
|
||||||
|
"SELECT presence_penalty FROM data WHERE guild_id = ?",
|
||||||
|
(ctx.guild.id,),
|
||||||
|
).fetchone()[0]
|
||||||
|
is not None
|
||||||
|
and presence_penalty is None
|
||||||
|
):
|
||||||
|
presence_penalty = c.execute(
|
||||||
|
"SELECT presence_penalty FROM data WHERE guild_id = ?",
|
||||||
|
(ctx.guild.id,),
|
||||||
|
).fetchone()[0]
|
||||||
else:
|
else:
|
||||||
presence_penalty = 0.0
|
presence_penalty = 0.0
|
||||||
if prompt_size is None:
|
if prompt_size is None:
|
||||||
if c.execute("SELECT prompt_size FROM data WHERE guild_id = ?", (ctx.guild.id,)).fetchone()[0] is not None and prompt_size is None:
|
if (
|
||||||
prompt_size = c.execute("SELECT prompt_size FROM data WHERE guild_id = ?", (ctx.guild.id,)).fetchone()[0]
|
c.execute(
|
||||||
|
"SELECT prompt_size FROM data WHERE guild_id = ?", (ctx.guild.id,)
|
||||||
|
).fetchone()[0]
|
||||||
|
is not None
|
||||||
|
and prompt_size is None
|
||||||
|
):
|
||||||
|
prompt_size = c.execute(
|
||||||
|
"SELECT prompt_size FROM data WHERE guild_id = ?", (ctx.guild.id,)
|
||||||
|
).fetchone()[0]
|
||||||
else:
|
else:
|
||||||
prompt_size = 1
|
prompt_size = 1
|
||||||
#update the database
|
# update the database
|
||||||
c.execute("UPDATE data SET max_tokens = ?, temperature = ?, frequency_penalty = ?, presence_penalty = ?, prompt_size = ? WHERE guild_id = ?", (max_tokens, temperature, frequency_penalty, presence_penalty, prompt_size, ctx.guild.id))
|
c.execute(
|
||||||
|
"UPDATE data SET max_tokens = ?, temperature = ?, frequency_penalty = ?, presence_penalty = ?, prompt_size = ? WHERE guild_id = ?",
|
||||||
|
(
|
||||||
|
max_tokens,
|
||||||
|
temperature,
|
||||||
|
frequency_penalty,
|
||||||
|
presence_penalty,
|
||||||
|
prompt_size,
|
||||||
|
ctx.guild.id,
|
||||||
|
),
|
||||||
|
)
|
||||||
conn.commit()
|
conn.commit()
|
||||||
await ctx.respond("Advanced settings updated", ephemeral=True)
|
await ctx.respond("Advanced settings updated", ephemeral=True)
|
||||||
#create a command called "delete" that only admins can use wich deletes the guild id, the api key, the channel id and the advanced settings from the database
|
# create a command called "delete" that only admins can use wich deletes the guild id, the api key, the channel id and the advanced settings from the database
|
||||||
|
|
||||||
@discord.slash_command(name="default", description="Default settings")
|
@discord.slash_command(name="default", description="Default settings")
|
||||||
##@discord.commands.permissions(administrator=True)
|
##@discord.commands.permissions(administrator=True)
|
||||||
async def default(self, ctx: discord.ApplicationContext):
|
async def default(self, ctx: discord.ApplicationContext):
|
||||||
debug(f"The user {ctx.author} ran the default command in the channel {ctx.channel} of the guild {ctx.guild}, named {ctx.guild.name}")
|
debug(
|
||||||
#check if the guild is in the database
|
f"The user {ctx.author} ran the default command in the channel {ctx.channel} of the guild {ctx.guild}, named {ctx.guild.name}"
|
||||||
|
)
|
||||||
|
# check if the guild is in the database
|
||||||
c.execute("SELECT * FROM data WHERE guild_id = ?", (ctx.guild.id,))
|
c.execute("SELECT * FROM data WHERE guild_id = ?", (ctx.guild.id,))
|
||||||
if c.fetchone() is None:
|
if c.fetchone() is None:
|
||||||
await ctx.respond("This server is not setup, please run /setup", ephemeral=True)
|
await ctx.respond(
|
||||||
|
"This server is not setup, please run /setup", ephemeral=True
|
||||||
|
)
|
||||||
return
|
return
|
||||||
#set the advanced settings (max_tokens, temperature, frequency_penalty, presence_penalty, prompt_size) and also prompt_prefix to their default values
|
# set the advanced settings (max_tokens, temperature, frequency_penalty, presence_penalty, prompt_size) and also prompt_prefix to their default values
|
||||||
c.execute("UPDATE data SET max_tokens = ?, temperature = ?, frequency_penalty = ?, presence_penalty = ?, prompt_size = ? WHERE guild_id = ?", (64, 0.9, 0.0, 0.0, 5, ctx.guild.id))
|
c.execute(
|
||||||
|
"UPDATE data SET max_tokens = ?, temperature = ?, frequency_penalty = ?, presence_penalty = ?, prompt_size = ? WHERE guild_id = ?",
|
||||||
|
(64, 0.9, 0.0, 0.0, 5, ctx.guild.id),
|
||||||
|
)
|
||||||
conn.commit()
|
conn.commit()
|
||||||
await ctx.respond("The advanced settings have been set to their default values", ephemeral=True)
|
await ctx.respond(
|
||||||
#create a command called "cancel" that deletes the last message sent by the bot in the response channel
|
"The advanced settings have been set to their default values",
|
||||||
|
ephemeral=True,
|
||||||
|
)
|
||||||
|
|
||||||
#when a message is sent into a channel check if the guild is in the database and if the bot is enabled
|
# create a command called "cancel" that deletes the last message sent by the bot in the response channel
|
||||||
@discord.slash_command(name="info", description="Show the information stored about this server")
|
|
||||||
|
# when a message is sent into a channel check if the guild is in the database and if the bot is enabled
|
||||||
|
@discord.slash_command(
|
||||||
|
name="info", description="Show the information stored about this server"
|
||||||
|
)
|
||||||
async def info(self, ctx: discord.ApplicationContext):
|
async def info(self, ctx: discord.ApplicationContext):
|
||||||
debug(f"The user {ctx.author} ran the info command in the channel {ctx.channel} of the guild {ctx.guild}, named {ctx.guild.name}")
|
debug(
|
||||||
#this command sends all the data about the guild, including the api key, the channel id, the advanced settings and the uses_count_today
|
f"The user {ctx.author} ran the info command in the channel {ctx.channel} of the guild {ctx.guild}, named {ctx.guild.name}"
|
||||||
#check if the guild is in the database
|
)
|
||||||
try:
|
# this command sends all the data about the guild, including the api key, the channel id, the advanced settings and the uses_count_today
|
||||||
|
# check if the guild is in the database
|
||||||
|
try:
|
||||||
c.execute("SELECT * FROM data WHERE guild_id = ?", (ctx.guild.id,))
|
c.execute("SELECT * FROM data WHERE guild_id = ?", (ctx.guild.id,))
|
||||||
data = c.fetchone()
|
data = c.fetchone()
|
||||||
except: data = None
|
except:
|
||||||
|
data = None
|
||||||
if data[2] is None:
|
if data[2] is None:
|
||||||
await ctx.respond("This server is not setup", ephemeral=True)
|
await ctx.respond("This server is not setup", ephemeral=True)
|
||||||
return
|
return
|
||||||
try:
|
try:
|
||||||
c.execute("SELECT * FROM model WHERE guild_id = ?", (ctx.guild.id,))
|
c.execute("SELECT * FROM model WHERE guild_id = ?", (ctx.guild.id,))
|
||||||
model = c.fetchone()[1]
|
model = c.fetchone()[1]
|
||||||
except: model = None
|
except:
|
||||||
if model is None: model = "davinci"
|
model = None
|
||||||
embed = discord.Embed(title="Info", description="Here is the info page", color=0x00ff00)
|
if model is None:
|
||||||
|
model = "davinci"
|
||||||
|
embed = discord.Embed(
|
||||||
|
title="Info", description="Here is the info page", color=0x00FF00
|
||||||
|
)
|
||||||
embed.add_field(name="guild_id", value=data[0], inline=False)
|
embed.add_field(name="guild_id", value=data[0], inline=False)
|
||||||
embed.add_field(name="API Key", value="secret", inline=False)
|
embed.add_field(name="API Key", value="secret", inline=False)
|
||||||
embed.add_field(name="Main channel ID", value=data[1], inline=False)
|
embed.add_field(name="Main channel ID", value=data[1], inline=False)
|
||||||
@@ -125,15 +226,17 @@ class Settings (discord.Cog) :
|
|||||||
embed.add_field(name="Prompt prefix", value=data[10], inline=False)
|
embed.add_field(name="Prompt prefix", value=data[10], inline=False)
|
||||||
await ctx.respond(embed=embed, ephemeral=True)
|
await ctx.respond(embed=embed, ephemeral=True)
|
||||||
|
|
||||||
#add a slash command called "prefix" that changes the prefix of the bot
|
# add a slash command called "prefix" that changes the prefix of the bot
|
||||||
@discord.slash_command(name="prefix", description="Change the prefix of the prompt")
|
@discord.slash_command(name="prefix", description="Change the prefix of the prompt")
|
||||||
async def prefix(self, ctx: discord.ApplicationContext, prefix: str = ""):
|
async def prefix(self, ctx: discord.ApplicationContext, prefix: str = ""):
|
||||||
debug(f"The user {ctx.author.name} ran the prefix command command in the channel {ctx.channel} of the guild {ctx.guild}, named {ctx.guild.name}")
|
debug(
|
||||||
|
f"The user {ctx.author.name} ran the prefix command command in the channel {ctx.channel} of the guild {ctx.guild}, named {ctx.guild.name}"
|
||||||
|
)
|
||||||
try:
|
try:
|
||||||
c.execute("SELECT * FROM data WHERE guild_id = ?", (ctx.guild.id,))
|
c.execute("SELECT * FROM data WHERE guild_id = ?", (ctx.guild.id,))
|
||||||
data = c.fetchone()
|
data = c.fetchone()
|
||||||
api_key = data[2]
|
api_key = data[2]
|
||||||
except:
|
except:
|
||||||
await ctx.respond("This server is not setup", ephemeral=True)
|
await ctx.respond("This server is not setup", ephemeral=True)
|
||||||
return
|
return
|
||||||
if api_key is None or api_key == "":
|
if api_key is None or api_key == "":
|
||||||
@@ -142,19 +245,33 @@ class Settings (discord.Cog) :
|
|||||||
if prefix != "":
|
if prefix != "":
|
||||||
await ctx.defer()
|
await ctx.defer()
|
||||||
if await moderate(api_key=api_key, text=prefix):
|
if await moderate(api_key=api_key, text=prefix):
|
||||||
await ctx.respond("This has been flagged as inappropriate by OpenAI, please choose another prefix", ephemeral=True)
|
await ctx.respond(
|
||||||
|
"This has been flagged as inappropriate by OpenAI, please choose another prefix",
|
||||||
|
ephemeral=True,
|
||||||
|
)
|
||||||
return
|
return
|
||||||
await ctx.respond("Prefix changed !", ephemeral=True, delete_after=5)
|
await ctx.respond("Prefix changed !", ephemeral=True, delete_after=5)
|
||||||
c.execute("UPDATE data SET prompt_prefix = ? WHERE guild_id = ?", (prefix, ctx.guild.id))
|
c.execute(
|
||||||
|
"UPDATE data SET prompt_prefix = ? WHERE guild_id = ?",
|
||||||
|
(prefix, ctx.guild.id),
|
||||||
|
)
|
||||||
conn.commit()
|
conn.commit()
|
||||||
|
|
||||||
#when someone mentions the bot, check if the guild is in the database and if the bot is enabled. If it is, send a message answering the mention
|
# when someone mentions the bot, check if the guild is in the database and if the bot is enabled. If it is, send a message answering the mention
|
||||||
@discord.slash_command(name="pretend", description="Make the bot pretend to be someone else")
|
@discord.slash_command(
|
||||||
@discord.option(name="pretend to be...", description="The person/thing you want the bot to pretend to be. Leave blank to disable pretend mode", required=False)
|
name="pretend", description="Make the bot pretend to be someone else"
|
||||||
|
)
|
||||||
|
@discord.option(
|
||||||
|
name="pretend to be...",
|
||||||
|
description="The person/thing you want the bot to pretend to be. Leave blank to disable pretend mode",
|
||||||
|
required=False,
|
||||||
|
)
|
||||||
async def pretend(self, ctx: discord.ApplicationContext, pretend_to_be: str = ""):
|
async def pretend(self, ctx: discord.ApplicationContext, pretend_to_be: str = ""):
|
||||||
debug(f"The user {ctx.author} ran the pretend command in the channel {ctx.channel} of the guild {ctx.guild}, named {ctx.guild.name}")
|
debug(
|
||||||
#check if the guild is in the database
|
f"The user {ctx.author} ran the pretend command in the channel {ctx.channel} of the guild {ctx.guild}, named {ctx.guild.name}"
|
||||||
try:
|
)
|
||||||
|
# check if the guild is in the database
|
||||||
|
try:
|
||||||
c.execute("SELECT * FROM data WHERE guild_id = ?", (ctx.guild.id,))
|
c.execute("SELECT * FROM data WHERE guild_id = ?", (ctx.guild.id,))
|
||||||
data = c.fetchone()
|
data = c.fetchone()
|
||||||
api_key = data[2]
|
api_key = data[2]
|
||||||
@@ -167,71 +284,102 @@ class Settings (discord.Cog) :
|
|||||||
if pretend_to_be is not None or pretend_to_be != "":
|
if pretend_to_be is not None or pretend_to_be != "":
|
||||||
await ctx.defer()
|
await ctx.defer()
|
||||||
if await moderate(api_key=api_key, text=pretend_to_be):
|
if await moderate(api_key=api_key, text=pretend_to_be):
|
||||||
await ctx.respond("This has been flagged as inappropriate by OpenAI, please choose another name", ephemeral=True)
|
await ctx.respond(
|
||||||
|
"This has been flagged as inappropriate by OpenAI, please choose another name",
|
||||||
|
ephemeral=True,
|
||||||
|
)
|
||||||
return
|
return
|
||||||
if pretend_to_be == "":
|
if pretend_to_be == "":
|
||||||
pretend_to_be = ""
|
pretend_to_be = ""
|
||||||
c.execute("UPDATE data SET pretend_enabled = 0 WHERE guild_id = ?", (ctx.guild.id,))
|
c.execute(
|
||||||
|
"UPDATE data SET pretend_enabled = 0 WHERE guild_id = ?",
|
||||||
|
(ctx.guild.id,),
|
||||||
|
)
|
||||||
conn.commit()
|
conn.commit()
|
||||||
await ctx.respond("Pretend mode disabled", ephemeral=True, delete_after=5)
|
await ctx.respond("Pretend mode disabled", ephemeral=True, delete_after=5)
|
||||||
await ctx.guild.me.edit(nick=None)
|
await ctx.guild.me.edit(nick=None)
|
||||||
return
|
return
|
||||||
else:
|
else:
|
||||||
c.execute("UPDATE data SET pretend_enabled = 1 WHERE guild_id = ?", (ctx.guild.id,))
|
c.execute(
|
||||||
|
"UPDATE data SET pretend_enabled = 1 WHERE guild_id = ?",
|
||||||
|
(ctx.guild.id,),
|
||||||
|
)
|
||||||
conn.commit()
|
conn.commit()
|
||||||
await ctx.respond("Pretend mode enabled", ephemeral=True, delete_after=5)
|
await ctx.respond("Pretend mode enabled", ephemeral=True, delete_after=5)
|
||||||
#change the bots name on the server wit ctx.guild.me.edit(nick=pretend_to_be)
|
# change the bots name on the server wit ctx.guild.me.edit(nick=pretend_to_be)
|
||||||
await ctx.guild.me.edit(nick=pretend_to_be)
|
await ctx.guild.me.edit(nick=pretend_to_be)
|
||||||
c.execute("UPDATE data SET pretend_to_be = ? WHERE guild_id = ?", (pretend_to_be, ctx.guild.id))
|
c.execute(
|
||||||
|
"UPDATE data SET pretend_to_be = ? WHERE guild_id = ?",
|
||||||
|
(pretend_to_be, ctx.guild.id),
|
||||||
|
)
|
||||||
conn.commit()
|
conn.commit()
|
||||||
#if the usename is longer than 32 characters, shorten it
|
# if the usename is longer than 32 characters, shorten it
|
||||||
if len(pretend_to_be) > 31:
|
if len(pretend_to_be) > 31:
|
||||||
pretend_to_be = pretend_to_be[:32]
|
pretend_to_be = pretend_to_be[:32]
|
||||||
await ctx.guild.me.edit(nick=pretend_to_be)
|
await ctx.guild.me.edit(nick=pretend_to_be)
|
||||||
return
|
return
|
||||||
|
|
||||||
@discord.slash_command(name="enable_tts", description="Enable TTS when chatting")
|
@discord.slash_command(name="enable_tts", description="Enable TTS when chatting")
|
||||||
async def enable_tts(self, ctx: discord.ApplicationContext):
|
async def enable_tts(self, ctx: discord.ApplicationContext):
|
||||||
#get the guild id
|
# get the guild id
|
||||||
guild_id = ctx.guild.id
|
guild_id = ctx.guild.id
|
||||||
#connect to the database
|
# connect to the database
|
||||||
#update the tts value in the database
|
# update the tts value in the database
|
||||||
c.execute("UPDATE data SET tts = 1 WHERE guild_id = ?", (guild_id,))
|
c.execute("UPDATE data SET tts = 1 WHERE guild_id = ?", (guild_id,))
|
||||||
conn.commit()
|
conn.commit()
|
||||||
#send a message
|
# send a message
|
||||||
await ctx.respond("TTS has been enabled", ephemeral=True)
|
await ctx.respond("TTS has been enabled", ephemeral=True)
|
||||||
|
|
||||||
@discord.slash_command(name="disable_tts", description="Disable TTS when chatting")
|
@discord.slash_command(name="disable_tts", description="Disable TTS when chatting")
|
||||||
async def disable_tts(self, ctx: discord.ApplicationContext):
|
async def disable_tts(self, ctx: discord.ApplicationContext):
|
||||||
#get the guild id
|
# get the guild id
|
||||||
guild_id = ctx.guild.id
|
guild_id = ctx.guild.id
|
||||||
#connect to the database
|
# connect to the database
|
||||||
#update the tts value in the database
|
# update the tts value in the database
|
||||||
c.execute("UPDATE data SET tts = 0 WHERE guild_id = ?", (guild_id,))
|
c.execute("UPDATE data SET tts = 0 WHERE guild_id = ?", (guild_id,))
|
||||||
conn.commit()
|
conn.commit()
|
||||||
#send a message
|
# send a message
|
||||||
await ctx.respond("TTS has been disabled", ephemeral=True)
|
await ctx.respond("TTS has been disabled", ephemeral=True)
|
||||||
#autocompletition
|
|
||||||
|
# autocompletition
|
||||||
async def autocomplete(ctx: discord.AutocompleteContext):
|
async def autocomplete(ctx: discord.AutocompleteContext):
|
||||||
return [model for model in models if model.startswith(ctx.value)]
|
return [model for model in models if model.startswith(ctx.value)]
|
||||||
|
|
||||||
@discord.slash_command(name="model", description="Change the model used by the bot")
|
@discord.slash_command(name="model", description="Change the model used by the bot")
|
||||||
@discord.option(name="model", description="The model you want to use. Leave blank to use the davinci model", required=False, autocomplete=autocomplete)
|
@discord.option(
|
||||||
|
name="model",
|
||||||
|
description="The model you want to use. Leave blank to use the davinci model",
|
||||||
|
required=False,
|
||||||
|
autocomplete=autocomplete,
|
||||||
|
)
|
||||||
@default_permissions(administrator=True)
|
@default_permissions(administrator=True)
|
||||||
async def model(self, ctx: discord.ApplicationContext, model: str = "davinci"):
|
async def model(self, ctx: discord.ApplicationContext, model: str = "davinci"):
|
||||||
try:
|
try:
|
||||||
c.execute("SELECT * FROM model WHERE guild_id = ?", (ctx.guild.id,))
|
c.execute("SELECT * FROM model WHERE guild_id = ?", (ctx.guild.id,))
|
||||||
data = c.fetchone()[1]
|
data = c.fetchone()[1]
|
||||||
except:
|
except:
|
||||||
data = None
|
data = None
|
||||||
if data is None: c.execute("INSERT INTO model VALUES (?, ?)", (ctx.guild.id, model))
|
if data is None:
|
||||||
else: c.execute("UPDATE model SET model_name = ? WHERE guild_id = ?", (model, ctx.guild.id))
|
c.execute("INSERT INTO model VALUES (?, ?)", (ctx.guild.id, model))
|
||||||
|
else:
|
||||||
|
c.execute(
|
||||||
|
"UPDATE model SET model_name = ? WHERE guild_id = ?",
|
||||||
|
(model, ctx.guild.id),
|
||||||
|
)
|
||||||
conn.commit()
|
conn.commit()
|
||||||
await ctx.respond("Model changed !", ephemeral=True)
|
await ctx.respond("Model changed !", ephemeral=True)
|
||||||
|
|
||||||
async def images_recognition_autocomplete(ctx: discord.AutocompleteContext):
|
async def images_recognition_autocomplete(ctx: discord.AutocompleteContext):
|
||||||
return [state for state in images_recognition if state.startswith(ctx.value)]
|
return [state for state in images_recognition if state.startswith(ctx.value)]
|
||||||
@discord.slash_command(name="images", description="Enable or disable images recognition")
|
|
||||||
@discord.option(name="enable_disable", description="Enable or disable images recognition", autocomplete=images_recognition_autocomplete)
|
@discord.slash_command(
|
||||||
|
name="images", description="Enable or disable images recognition"
|
||||||
|
)
|
||||||
|
@discord.option(
|
||||||
|
name="enable_disable",
|
||||||
|
description="Enable or disable images recognition",
|
||||||
|
autocomplete=images_recognition_autocomplete,
|
||||||
|
)
|
||||||
@default_permissions(administrator=True)
|
@default_permissions(administrator=True)
|
||||||
async def images(self, ctx: discord.ApplicationContext, enable_disable: str):
|
async def images(self, ctx: discord.ApplicationContext, enable_disable: str):
|
||||||
try:
|
try:
|
||||||
@@ -239,9 +387,22 @@ class Settings (discord.Cog) :
|
|||||||
data = c.fetchone()
|
data = c.fetchone()
|
||||||
except:
|
except:
|
||||||
data = None
|
data = None
|
||||||
if enable_disable == "enable": enable_disable = 1
|
if enable_disable == "enable":
|
||||||
elif enable_disable == "disable": enable_disable = 0
|
enable_disable = 1
|
||||||
if data is None: c.execute("INSERT INTO images VALUES (?, ?, ?)", (ctx.guild.id, 0, enable_disable))
|
elif enable_disable == "disable":
|
||||||
else: c.execute("UPDATE images SET is_enabled = ? WHERE guild_id = ?", (enable_disable, ctx.guild.id))
|
enable_disable = 0
|
||||||
|
if data is None:
|
||||||
|
c.execute(
|
||||||
|
"INSERT INTO images VALUES (?, ?, ?)", (ctx.guild.id, 0, enable_disable)
|
||||||
|
)
|
||||||
|
else:
|
||||||
|
c.execute(
|
||||||
|
"UPDATE images SET is_enabled = ? WHERE guild_id = ?",
|
||||||
|
(enable_disable, ctx.guild.id),
|
||||||
|
)
|
||||||
conn.commit()
|
conn.commit()
|
||||||
await ctx.respond("Images recognition has been " + ("enabled" if enable_disable == 1 else "disabled"), ephemeral=True)
|
await ctx.respond(
|
||||||
|
"Images recognition has been "
|
||||||
|
+ ("enabled" if enable_disable == 1 else "disabled"),
|
||||||
|
ephemeral=True,
|
||||||
|
)
|
||||||
|
|||||||
@@ -1,7 +1,8 @@
|
|||||||
import discord
|
import discord
|
||||||
from config import debug, conn, c, connp, cp
|
from config import debug, conn, c, connp, cp
|
||||||
|
|
||||||
class Setup (discord.Cog) :
|
|
||||||
|
class Setup(discord.Cog):
|
||||||
def __init__(self, bot: discord.Bot):
|
def __init__(self, bot: discord.Bot):
|
||||||
super().__init__()
|
super().__init__()
|
||||||
self.bot = bot
|
self.bot = bot
|
||||||
@@ -9,111 +10,178 @@ class Setup (discord.Cog) :
|
|||||||
@discord.slash_command(name="setup", description="Setup the bot")
|
@discord.slash_command(name="setup", description="Setup the bot")
|
||||||
@discord.option(name="channel_id", description="The channel id", required=True)
|
@discord.option(name="channel_id", description="The channel id", required=True)
|
||||||
@discord.option(name="api_key", description="The api key", required=True)
|
@discord.option(name="api_key", description="The api key", required=True)
|
||||||
async def setup(self, ctx: discord.ApplicationContext, channel: discord.TextChannel, api_key: str):
|
async def setup(
|
||||||
#check if the api key is valid
|
self,
|
||||||
debug(f"The user {ctx.author} ran the setup command in the channel {ctx.channel} of the guild {ctx.guild}, named {ctx.guild.name}")
|
ctx: discord.ApplicationContext,
|
||||||
#check if the channel is valid
|
channel: discord.TextChannel,
|
||||||
|
api_key: str,
|
||||||
|
):
|
||||||
|
# check if the api key is valid
|
||||||
|
debug(
|
||||||
|
f"The user {ctx.author} ran the setup command in the channel {ctx.channel} of the guild {ctx.guild}, named {ctx.guild.name}"
|
||||||
|
)
|
||||||
|
# check if the channel is valid
|
||||||
if channel is None:
|
if channel is None:
|
||||||
await ctx.respond("Invalid channel id", ephemeral=True)
|
await ctx.respond("Invalid channel id", ephemeral=True)
|
||||||
return
|
return
|
||||||
#check if the guild is already in the database bi checking if there is a key for the guild
|
# check if the guild is already in the database bi checking if there is a key for the guild
|
||||||
try:
|
try:
|
||||||
c.execute("SELECT * FROM data WHERE guild_id = ?", (ctx.guild.id,))
|
c.execute("SELECT * FROM data WHERE guild_id = ?", (ctx.guild.id,))
|
||||||
data = c.fetchone()
|
data = c.fetchone()
|
||||||
if data[3] == None: data = None
|
if data[3] == None:
|
||||||
|
data = None
|
||||||
except:
|
except:
|
||||||
data = None
|
data = None
|
||||||
|
|
||||||
if data != None:
|
|
||||||
c.execute("UPDATE data SET channel_id = ?, api_key = ? WHERE guild_id = ?", (channel.id, api_key, ctx.guild.id))
|
|
||||||
# c.execute("UPDATE data SET is_active = ?, max_tokens = ?, temperature = ?, frequency_penalty = ?, presence_penalty = ?, prompt_size = ? WHERE guild_id = ?", (False, 64, 0.9, 0.0, 0.0, 5, ctx.guild.id))
|
|
||||||
conn.commit()
|
|
||||||
await ctx.respond("The channel id and the api key have been updated", ephemeral=True)
|
|
||||||
else:
|
|
||||||
#in this case, the guild is not in the database, so we add it
|
|
||||||
c.execute("INSERT INTO data VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)", (ctx.guild.id, channel.id, api_key, False, 64, 0.9, 0.0, 0.0, 0, 5, "", False, "", False))
|
|
||||||
conn.commit()
|
|
||||||
await ctx.respond("The channel id and the api key have been added", ephemeral=True)
|
|
||||||
|
|
||||||
@discord.slash_command(name="delete", description="Delete the information about this server")
|
if data != None:
|
||||||
|
c.execute(
|
||||||
|
"UPDATE data SET channel_id = ?, api_key = ? WHERE guild_id = ?",
|
||||||
|
(channel.id, api_key, ctx.guild.id),
|
||||||
|
)
|
||||||
|
# c.execute("UPDATE data SET is_active = ?, max_tokens = ?, temperature = ?, frequency_penalty = ?, presence_penalty = ?, prompt_size = ? WHERE guild_id = ?", (False, 64, 0.9, 0.0, 0.0, 5, ctx.guild.id))
|
||||||
|
conn.commit()
|
||||||
|
await ctx.respond(
|
||||||
|
"The channel id and the api key have been updated", ephemeral=True
|
||||||
|
)
|
||||||
|
else:
|
||||||
|
# in this case, the guild is not in the database, so we add it
|
||||||
|
c.execute(
|
||||||
|
"INSERT INTO data VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)",
|
||||||
|
(
|
||||||
|
ctx.guild.id,
|
||||||
|
channel.id,
|
||||||
|
api_key,
|
||||||
|
False,
|
||||||
|
64,
|
||||||
|
0.9,
|
||||||
|
0.0,
|
||||||
|
0.0,
|
||||||
|
0,
|
||||||
|
5,
|
||||||
|
"",
|
||||||
|
False,
|
||||||
|
"",
|
||||||
|
False,
|
||||||
|
),
|
||||||
|
)
|
||||||
|
conn.commit()
|
||||||
|
await ctx.respond(
|
||||||
|
"The channel id and the api key have been added", ephemeral=True
|
||||||
|
)
|
||||||
|
|
||||||
|
@discord.slash_command(
|
||||||
|
name="delete", description="Delete the information about this server"
|
||||||
|
)
|
||||||
##@discord.commands.permissions(administrator=True)
|
##@discord.commands.permissions(administrator=True)
|
||||||
async def delete(self, ctx: discord.ApplicationContext):
|
async def delete(self, ctx: discord.ApplicationContext):
|
||||||
debug(f"The user {ctx.author} ran the delete command in the channel {ctx.channel} of the guild {ctx.guild}, named {ctx.guild.name}")
|
debug(
|
||||||
#check if the guild is in the database
|
f"The user {ctx.author} ran the delete command in the channel {ctx.channel} of the guild {ctx.guild}, named {ctx.guild.name}"
|
||||||
|
)
|
||||||
|
# check if the guild is in the database
|
||||||
c.execute("SELECT * FROM data WHERE guild_id = ?", (ctx.guild.id,))
|
c.execute("SELECT * FROM data WHERE guild_id = ?", (ctx.guild.id,))
|
||||||
if c.fetchone() is None:
|
if c.fetchone() is None:
|
||||||
await ctx.respond("This server is not setup", ephemeral=True)
|
await ctx.respond("This server is not setup", ephemeral=True)
|
||||||
return
|
return
|
||||||
#delete the guild from the database, except the guild id and the uses_count_today
|
# delete the guild from the database, except the guild id and the uses_count_today
|
||||||
c.execute("UPDATE data SET api_key = ?, channel_id = ?, is_active = ?, max_tokens = ?, temperature = ?, frequency_penalty = ?, presence_penalty = ?, prompt_size = ? WHERE guild_id = ?", (None, None, False, 50, 0.9, 0.0, 0.0, 0, ctx.guild.id))
|
c.execute(
|
||||||
|
"UPDATE data SET api_key = ?, channel_id = ?, is_active = ?, max_tokens = ?, temperature = ?, frequency_penalty = ?, presence_penalty = ?, prompt_size = ? WHERE guild_id = ?",
|
||||||
|
(None, None, False, 50, 0.9, 0.0, 0.0, 0, ctx.guild.id),
|
||||||
|
)
|
||||||
conn.commit()
|
conn.commit()
|
||||||
await ctx.respond("Deleted", ephemeral=True)
|
await ctx.respond("Deleted", ephemeral=True)
|
||||||
|
|
||||||
#create a command called "enable" that only admins can use
|
# create a command called "enable" that only admins can use
|
||||||
@discord.slash_command(name="enable", description="Enable the bot")
|
@discord.slash_command(name="enable", description="Enable the bot")
|
||||||
##@discord.commands.permissions(administrator=True)
|
##@discord.commands.permissions(administrator=True)
|
||||||
async def enable(self, ctx: discord.ApplicationContext):
|
async def enable(self, ctx: discord.ApplicationContext):
|
||||||
#if the guild is eqal to 1014156298226515970, the guild is banned
|
# if the guild is eqal to 1014156298226515970, the guild is banned
|
||||||
if ctx.guild.id == 1014156298226515970:
|
if ctx.guild.id == 1014156298226515970:
|
||||||
await ctx.respond("This server is banned for bad and nsfw use.", ephemeral=True)
|
await ctx.respond(
|
||||||
|
"This server is banned for bad and nsfw use.", ephemeral=True
|
||||||
|
)
|
||||||
return
|
return
|
||||||
#check if the guild is in the database
|
# check if the guild is in the database
|
||||||
debug(f"The user {ctx.author} ran the enable command in the channel {ctx.channel} of the guild {ctx.guild}, named {ctx.guild.name}")
|
debug(
|
||||||
|
f"The user {ctx.author} ran the enable command in the channel {ctx.channel} of the guild {ctx.guild}, named {ctx.guild.name}"
|
||||||
|
)
|
||||||
c.execute("SELECT * FROM data WHERE guild_id = ?", (ctx.guild.id,))
|
c.execute("SELECT * FROM data WHERE guild_id = ?", (ctx.guild.id,))
|
||||||
if c.fetchone() is None:
|
if c.fetchone() is None:
|
||||||
await ctx.respond("This server is not setup", ephemeral=True)
|
await ctx.respond("This server is not setup", ephemeral=True)
|
||||||
return
|
return
|
||||||
#enable the guild
|
# enable the guild
|
||||||
c.execute("UPDATE data SET is_active = ? WHERE guild_id = ?", (True, ctx.guild.id))
|
c.execute(
|
||||||
|
"UPDATE data SET is_active = ? WHERE guild_id = ?", (True, ctx.guild.id)
|
||||||
|
)
|
||||||
conn.commit()
|
conn.commit()
|
||||||
await ctx.respond("Enabled", ephemeral=True)
|
await ctx.respond("Enabled", ephemeral=True)
|
||||||
|
|
||||||
#create a command called "disable" that only admins can use
|
# create a command called "disable" that only admins can use
|
||||||
@discord.slash_command(name="disable", description="Disable the bot")
|
@discord.slash_command(name="disable", description="Disable the bot")
|
||||||
##@discord.commands.permissions(administrator=True)
|
##@discord.commands.permissions(administrator=True)
|
||||||
async def disable(self, ctx: discord.ApplicationContext):
|
async def disable(self, ctx: discord.ApplicationContext):
|
||||||
debug(f"The user {ctx.author} ran the disable command in the channel {ctx.channel} of the guild {ctx.guild}, named {ctx.guild.name}")
|
debug(
|
||||||
#check if the guild is in the database
|
f"The user {ctx.author} ran the disable command in the channel {ctx.channel} of the guild {ctx.guild}, named {ctx.guild.name}"
|
||||||
|
)
|
||||||
|
# check if the guild is in the database
|
||||||
c.execute("SELECT * FROM data WHERE guild_id = ?", (ctx.guild.id,))
|
c.execute("SELECT * FROM data WHERE guild_id = ?", (ctx.guild.id,))
|
||||||
if c.fetchone() is None:
|
if c.fetchone() is None:
|
||||||
await ctx.respond("This server is not setup", ephemeral=True)
|
await ctx.respond("This server is not setup", ephemeral=True)
|
||||||
return
|
return
|
||||||
#disable the guild
|
# disable the guild
|
||||||
c.execute("UPDATE data SET is_active = ? WHERE guild_id = ?", (False, ctx.guild.id))
|
c.execute(
|
||||||
|
"UPDATE data SET is_active = ? WHERE guild_id = ?", (False, ctx.guild.id)
|
||||||
|
)
|
||||||
conn.commit()
|
conn.commit()
|
||||||
await ctx.respond("Disabled", ephemeral=True)
|
await ctx.respond("Disabled", ephemeral=True)
|
||||||
|
|
||||||
#create a command calles "add channel" that can only be used in premium servers
|
# create a command calles "add channel" that can only be used in premium servers
|
||||||
@discord.slash_command(name="add_channel", description="Add a channel to the list of channels. Premium only.")
|
@discord.slash_command(
|
||||||
@discord.option(name="channel", description="The channel to add", type=discord.TextChannel, required=False)
|
name="add_channel",
|
||||||
async def add_channel(self, ctx: discord.ApplicationContext, channel: discord.TextChannel = None):
|
description="Add a channel to the list of channels. Premium only.",
|
||||||
debug(f"The user {ctx.author} ran the add_channel command in the channel {ctx.channel} of the guild {ctx.guild}, named {ctx.guild.name}")
|
)
|
||||||
#check if the guild is in the database
|
@discord.option(
|
||||||
|
name="channel",
|
||||||
|
description="The channel to add",
|
||||||
|
type=discord.TextChannel,
|
||||||
|
required=False,
|
||||||
|
)
|
||||||
|
async def add_channel(
|
||||||
|
self, ctx: discord.ApplicationContext, channel: discord.TextChannel = None
|
||||||
|
):
|
||||||
|
debug(
|
||||||
|
f"The user {ctx.author} ran the add_channel command in the channel {ctx.channel} of the guild {ctx.guild}, named {ctx.guild.name}"
|
||||||
|
)
|
||||||
|
# check if the guild is in the database
|
||||||
c.execute("SELECT * FROM data WHERE guild_id = ?", (ctx.guild.id,))
|
c.execute("SELECT * FROM data WHERE guild_id = ?", (ctx.guild.id,))
|
||||||
if c.fetchone() is None:
|
if c.fetchone() is None:
|
||||||
await ctx.respond("This server is not setup", ephemeral=True)
|
await ctx.respond("This server is not setup", ephemeral=True)
|
||||||
return
|
return
|
||||||
#check if the guild is premium
|
# check if the guild is premium
|
||||||
try :
|
try:
|
||||||
cp.execute("SELECT premium FROM data WHERE guild_id = ?", (ctx.guild.id,))
|
cp.execute("SELECT premium FROM data WHERE guild_id = ?", (ctx.guild.id,))
|
||||||
premium = cp.fetchone()[0]
|
premium = cp.fetchone()[0]
|
||||||
except :
|
except:
|
||||||
premium = 0
|
premium = 0
|
||||||
if not premium:
|
if not premium:
|
||||||
await ctx.respond("This server is not premium", ephemeral=True)
|
await ctx.respond("This server is not premium", ephemeral=True)
|
||||||
return
|
return
|
||||||
if channel is None:
|
if channel is None:
|
||||||
channel = ctx.channel
|
channel = ctx.channel
|
||||||
#check if the channel is already in the list
|
# check if the channel is already in the list
|
||||||
c.execute("SELECT channel_id FROM data WHERE guild_id = ?", (ctx.guild.id,))
|
c.execute("SELECT channel_id FROM data WHERE guild_id = ?", (ctx.guild.id,))
|
||||||
if str(channel.id) == c.fetchone()[0]:
|
if str(channel.id) == c.fetchone()[0]:
|
||||||
await ctx.respond("This channel is already set as the main channel", ephemeral=True)
|
await ctx.respond(
|
||||||
|
"This channel is already set as the main channel", ephemeral=True
|
||||||
|
)
|
||||||
return
|
return
|
||||||
cp.execute("SELECT * FROM channels WHERE guild_id = ?", (ctx.guild.id,))
|
cp.execute("SELECT * FROM channels WHERE guild_id = ?", (ctx.guild.id,))
|
||||||
guild_channels = cp.fetchone()
|
guild_channels = cp.fetchone()
|
||||||
if guild_channels is None:
|
if guild_channels is None:
|
||||||
# if the channel is not in the list, add it
|
# if the channel is not in the list, add it
|
||||||
cp.execute("INSERT INTO channels VALUES (?, ?, ?, ?, ?, ?)", (ctx.guild.id, channel.id, None, None, None, None))
|
cp.execute(
|
||||||
|
"INSERT INTO channels VALUES (?, ?, ?, ?, ?, ?)",
|
||||||
|
(ctx.guild.id, channel.id, None, None, None, None),
|
||||||
|
)
|
||||||
connp.commit()
|
connp.commit()
|
||||||
await ctx.respond(f"Added channel **{channel.name}**", ephemeral=True)
|
await ctx.respond(f"Added channel **{channel.name}**", ephemeral=True)
|
||||||
return
|
return
|
||||||
@@ -123,51 +191,76 @@ class Setup (discord.Cog) :
|
|||||||
return
|
return
|
||||||
for i in range(5):
|
for i in range(5):
|
||||||
if channels[i] == None:
|
if channels[i] == None:
|
||||||
cp.execute(f"UPDATE channels SET channel{i} = ? WHERE guild_id = ?", (channel.id, ctx.guild.id))
|
cp.execute(
|
||||||
|
f"UPDATE channels SET channel{i} = ? WHERE guild_id = ?",
|
||||||
|
(channel.id, ctx.guild.id),
|
||||||
|
)
|
||||||
connp.commit()
|
connp.commit()
|
||||||
await ctx.respond(f"Added channel **{channel.name}**", ephemeral=True)
|
await ctx.respond(f"Added channel **{channel.name}**", ephemeral=True)
|
||||||
return
|
return
|
||||||
await ctx.respond("You can only add 5 channels", ephemeral=True)
|
await ctx.respond("You can only add 5 channels", ephemeral=True)
|
||||||
|
|
||||||
#create a command called "remove channel" that can only be used in premium servers
|
# create a command called "remove channel" that can only be used in premium servers
|
||||||
@discord.slash_command(name="remove_channel", description="Remove a channel from the list of channels. Premium only.")
|
@discord.slash_command(
|
||||||
@discord.option(name="channel", description="The channel to remove", type=discord.TextChannel, required=False)
|
name="remove_channel",
|
||||||
async def remove_channel(self, ctx: discord.ApplicationContext, channel: discord.TextChannel = None):
|
description="Remove a channel from the list of channels. Premium only.",
|
||||||
debug(f"The user {ctx.author} ran the remove_channel command in the channel {ctx.channel} of the guild {ctx.guild}, named {ctx.guild.name}")
|
)
|
||||||
#check if the guild is in the database
|
@discord.option(
|
||||||
|
name="channel",
|
||||||
|
description="The channel to remove",
|
||||||
|
type=discord.TextChannel,
|
||||||
|
required=False,
|
||||||
|
)
|
||||||
|
async def remove_channel(
|
||||||
|
self, ctx: discord.ApplicationContext, channel: discord.TextChannel = None
|
||||||
|
):
|
||||||
|
debug(
|
||||||
|
f"The user {ctx.author} ran the remove_channel command in the channel {ctx.channel} of the guild {ctx.guild}, named {ctx.guild.name}"
|
||||||
|
)
|
||||||
|
# check if the guild is in the database
|
||||||
c.execute("SELECT * FROM data WHERE guild_id = ?", (ctx.guild.id,))
|
c.execute("SELECT * FROM data WHERE guild_id = ?", (ctx.guild.id,))
|
||||||
if c.fetchone() is None:
|
if c.fetchone() is None:
|
||||||
await ctx.respond("This server is not setup", ephemeral=True)
|
await ctx.respond("This server is not setup", ephemeral=True)
|
||||||
return
|
return
|
||||||
#check if the guild is premium
|
# check if the guild is premium
|
||||||
try :
|
try:
|
||||||
cp.execute("SELECT premium FROM data WHERE guild_id = ?", (ctx.guild.id,))
|
cp.execute("SELECT premium FROM data WHERE guild_id = ?", (ctx.guild.id,))
|
||||||
premium = cp.fetchone()[0]
|
premium = cp.fetchone()[0]
|
||||||
except :
|
except:
|
||||||
premium = 0
|
premium = 0
|
||||||
if not premium:
|
if not premium:
|
||||||
await ctx.respond("This server is not premium", ephemeral=True)
|
await ctx.respond("This server is not premium", ephemeral=True)
|
||||||
return
|
return
|
||||||
if channel is None:
|
if channel is None:
|
||||||
channel = ctx.channel
|
channel = ctx.channel
|
||||||
#check if the channel is in the list
|
# check if the channel is in the list
|
||||||
cp.execute("SELECT * FROM channels WHERE guild_id = ?", (ctx.guild.id,))
|
cp.execute("SELECT * FROM channels WHERE guild_id = ?", (ctx.guild.id,))
|
||||||
guild_channels = cp.fetchone()
|
guild_channels = cp.fetchone()
|
||||||
c.execute("SELECT channel_id FROM data WHERE guild_id = ?", (ctx.guild.id,))
|
c.execute("SELECT channel_id FROM data WHERE guild_id = ?", (ctx.guild.id,))
|
||||||
if str(channel.id) == c.fetchone()[0]:
|
if str(channel.id) == c.fetchone()[0]:
|
||||||
await ctx.respond("This channel is set as the main channel and therefore cannot be removed. Type /setup to change the main channel.", ephemeral=True)
|
await ctx.respond(
|
||||||
|
"This channel is set as the main channel and therefore cannot be removed. Type /setup to change the main channel.",
|
||||||
|
ephemeral=True,
|
||||||
|
)
|
||||||
return
|
return
|
||||||
if guild_channels is None:
|
if guild_channels is None:
|
||||||
await ctx.respond("This channel was not added. Nothing changed", ephemeral=True)
|
await ctx.respond(
|
||||||
|
"This channel was not added. Nothing changed", ephemeral=True
|
||||||
|
)
|
||||||
return
|
return
|
||||||
channels = guild_channels[1:]
|
channels = guild_channels[1:]
|
||||||
if str(channel.id) not in channels:
|
if str(channel.id) not in channels:
|
||||||
await ctx.respond("This channel was not added. Nothing changed", ephemeral=True)
|
await ctx.respond(
|
||||||
|
"This channel was not added. Nothing changed", ephemeral=True
|
||||||
|
)
|
||||||
return
|
return
|
||||||
#remove the channel from the list
|
# remove the channel from the list
|
||||||
for i in range(5):
|
for i in range(5):
|
||||||
if channels[i] == str(channel.id):
|
if channels[i] == str(channel.id):
|
||||||
cp.execute(f"UPDATE channels SET channel{i} = ? WHERE guild_id = ?", (None, ctx.guild.id))
|
cp.execute(
|
||||||
|
f"UPDATE channels SET channel{i} = ? WHERE guild_id = ?",
|
||||||
|
(None, ctx.guild.id),
|
||||||
|
)
|
||||||
connp.commit()
|
connp.commit()
|
||||||
await ctx.respond(f"Removed channel **{channel.name}**", ephemeral=True)
|
await ctx.respond(f"Removed channel **{channel.name}**", ephemeral=True)
|
||||||
return
|
return
|
||||||
|
|||||||
@@ -3,6 +3,7 @@ import sqlite3
|
|||||||
from dotenv import load_dotenv
|
from dotenv import load_dotenv
|
||||||
import os
|
import os
|
||||||
import openai
|
import openai
|
||||||
|
|
||||||
load_dotenv()
|
load_dotenv()
|
||||||
perspective_api_key = os.getenv("PERSPECTIVE_API_KEY")
|
perspective_api_key = os.getenv("PERSPECTIVE_API_KEY")
|
||||||
discord_token = os.getenv("DISCORD_TOKEN")
|
discord_token = os.getenv("DISCORD_TOKEN")
|
||||||
@@ -10,36 +11,46 @@ webhook_url = os.getenv("WEBHOOK_URL")
|
|||||||
max_uses: int = 400
|
max_uses: int = 400
|
||||||
logging.basicConfig(level=logging.INFO)
|
logging.basicConfig(level=logging.INFO)
|
||||||
|
|
||||||
os.environ["GOOGLE_APPLICATION_CREDENTIALS"] = "./../database/google-vision/botator.json"
|
os.environ[
|
||||||
|
"GOOGLE_APPLICATION_CREDENTIALS"
|
||||||
|
] = "./../database/google-vision/botator.json"
|
||||||
|
|
||||||
|
|
||||||
def debug(message):
|
def debug(message):
|
||||||
#if the os is windows, we logging.info(message), if
|
# if the os is windows, we logging.info(message), if
|
||||||
if os.name == "nt":
|
if os.name == "nt":
|
||||||
logging.info(message)
|
logging.info(message)
|
||||||
|
|
||||||
conn = sqlite3.connect('../database/data.db')
|
|
||||||
|
conn = sqlite3.connect("../database/data.db")
|
||||||
c = conn.cursor()
|
c = conn.cursor()
|
||||||
connp = sqlite3.connect('../database/premium.db')
|
connp = sqlite3.connect("../database/premium.db")
|
||||||
cp = connp.cursor()
|
cp = connp.cursor()
|
||||||
|
|
||||||
|
|
||||||
async def moderate(api_key, text):
|
async def moderate(api_key, text):
|
||||||
openai.api_key = api_key
|
openai.api_key = api_key
|
||||||
response = await openai.Moderation.acreate(
|
response = await openai.Moderation.acreate(
|
||||||
input=text,
|
input=text,
|
||||||
)
|
)
|
||||||
return response["results"][0]["flagged"]
|
return response["results"][0]["flagged"]
|
||||||
|
|
||||||
c.execute('''CREATE TABLE IF NOT EXISTS data (guild_id text, channel_id text, api_key text, is_active boolean, max_tokens integer, temperature real, frequency_penalty real, presence_penalty real, uses_count_today integer, prompt_size integer, prompt_prefix text, tts boolean, pretend_to_be text, pretend_enabled boolean)''')
|
|
||||||
#we delete the moderation table and create a new one, with all theese parameters as floats: TOXICITY: {result[0]}; SEVERE_TOXICITY: {result[1]}; IDENTITY ATTACK: {result[2]}; INSULT: {result[3]}; PROFANITY: {result[4]}; THREAT: {result[5]}; SEXUALLY EXPLICIT: {result[6]}; FLIRTATION: {result[7]}; OBSCENE: {result[8]}; SPAM: {result[9]}
|
c.execute(
|
||||||
|
"""CREATE TABLE IF NOT EXISTS data (guild_id text, channel_id text, api_key text, is_active boolean, max_tokens integer, temperature real, frequency_penalty real, presence_penalty real, uses_count_today integer, prompt_size integer, prompt_prefix text, tts boolean, pretend_to_be text, pretend_enabled boolean)"""
|
||||||
|
)
|
||||||
|
# we delete the moderation table and create a new one, with all theese parameters as floats: TOXICITY: {result[0]}; SEVERE_TOXICITY: {result[1]}; IDENTITY ATTACK: {result[2]}; INSULT: {result[3]}; PROFANITY: {result[4]}; THREAT: {result[5]}; SEXUALLY EXPLICIT: {result[6]}; FLIRTATION: {result[7]}; OBSCENE: {result[8]}; SPAM: {result[9]}
|
||||||
expected_columns = 14
|
expected_columns = 14
|
||||||
|
|
||||||
#we delete the moderation table and create a new one
|
# we delete the moderation table and create a new one
|
||||||
c.execute('''CREATE TABLE IF NOT EXISTS moderation (guild_id text, logs_channel_id text, is_enabled boolean, mod_role_id text, toxicity real, severe_toxicity real, identity_attack real, insult real, profanity real, threat real, sexually_explicit real, flirtation real, obscene real, spam real)''')
|
c.execute(
|
||||||
|
"""CREATE TABLE IF NOT EXISTS moderation (guild_id text, logs_channel_id text, is_enabled boolean, mod_role_id text, toxicity real, severe_toxicity real, identity_attack real, insult real, profanity real, threat real, sexually_explicit real, flirtation real, obscene real, spam real)"""
|
||||||
|
)
|
||||||
c.execute("PRAGMA table_info(moderation)")
|
c.execute("PRAGMA table_info(moderation)")
|
||||||
result = c.fetchall()
|
result = c.fetchall()
|
||||||
actual_columns = len(result)
|
actual_columns = len(result)
|
||||||
if actual_columns != expected_columns:
|
if actual_columns != expected_columns:
|
||||||
#we add the new columns
|
# we add the new columns
|
||||||
c.execute("ALTER TABLE moderation ADD COLUMN toxicity real")
|
c.execute("ALTER TABLE moderation ADD COLUMN toxicity real")
|
||||||
c.execute("ALTER TABLE moderation ADD COLUMN severe_toxicity real")
|
c.execute("ALTER TABLE moderation ADD COLUMN severe_toxicity real")
|
||||||
c.execute("ALTER TABLE moderation ADD COLUMN identity_attack real")
|
c.execute("ALTER TABLE moderation ADD COLUMN identity_attack real")
|
||||||
@@ -53,7 +64,13 @@ if actual_columns != expected_columns:
|
|||||||
else:
|
else:
|
||||||
print("Table already has the correct number of columns")
|
print("Table already has the correct number of columns")
|
||||||
pass
|
pass
|
||||||
c.execute('''CREATE TABLE IF NOT EXISTS model (guild_id text, model_name text)''')
|
c.execute("""CREATE TABLE IF NOT EXISTS model (guild_id text, model_name text)""")
|
||||||
c.execute('''CREATE TABLE IF NOT EXISTS images (guild_id text, usage_count integer, is_enabled boolean)''')
|
c.execute(
|
||||||
cp.execute('''CREATE TABLE IF NOT EXISTS data (user_id text, guild_id text, premium boolean)''')
|
"""CREATE TABLE IF NOT EXISTS images (guild_id text, usage_count integer, is_enabled boolean)"""
|
||||||
cp.execute('''CREATE TABLE IF NOT EXISTS channels (guild_id text, channel0 text, channel1 text, channel2 text, channel3 text, channel4 text)''')
|
)
|
||||||
|
cp.execute(
|
||||||
|
"""CREATE TABLE IF NOT EXISTS data (user_id text, guild_id text, premium boolean)"""
|
||||||
|
)
|
||||||
|
cp.execute(
|
||||||
|
"""CREATE TABLE IF NOT EXISTS channels (guild_id text, channel0 text, channel1 text, channel2 text, channel3 text, channel4 text)"""
|
||||||
|
)
|
||||||
|
|||||||
@@ -1,13 +1,14 @@
|
|||||||
import asyncio
|
import asyncio
|
||||||
from config import c, max_uses, cp, conn, debug, moderate
|
from config import c, max_uses, cp, conn, debug, moderate
|
||||||
import vision_processing
|
import vision_processing
|
||||||
import re
|
import re
|
||||||
import discord
|
import discord
|
||||||
import datetime
|
import datetime
|
||||||
import openai
|
import openai
|
||||||
import emoji # pip install emoji
|
import emoji # pip install emoji
|
||||||
import os
|
import os
|
||||||
|
|
||||||
|
|
||||||
async def replace_mentions(content, bot):
|
async def replace_mentions(content, bot):
|
||||||
mentions = re.findall(r"<@!?\d+>", content)
|
mentions = re.findall(r"<@!?\d+>", content)
|
||||||
for mention in mentions:
|
for mention in mentions:
|
||||||
@@ -20,32 +21,36 @@ async def replace_mentions(content, bot):
|
|||||||
async def extract_emoji(string):
|
async def extract_emoji(string):
|
||||||
# Match any character that is jus after a "+"
|
# Match any character that is jus after a "+"
|
||||||
pattern = r"(?<=\+)."
|
pattern = r"(?<=\+)."
|
||||||
#mach any custom emoji that is just after a "+", returns a tuple with the name and the id of the emoji
|
# mach any custom emoji that is just after a "+", returns a tuple with the name and the id of the emoji
|
||||||
custom_emoji_pattern = r"(?<=\+)<:(.+):(\d+)>"
|
custom_emoji_pattern = r"(?<=\+)<:(.+):(\d+)>"
|
||||||
#now we match the pattern with the string
|
# now we match the pattern with the string
|
||||||
matches = re.findall(pattern, string)
|
matches = re.findall(pattern, string)
|
||||||
custom_emoji_matches = re.findall(custom_emoji_pattern, string)
|
custom_emoji_matches = re.findall(custom_emoji_pattern, string)
|
||||||
found_emojis = []
|
found_emojis = []
|
||||||
for match in matches:
|
for match in matches:
|
||||||
debug(f"Match: {match}")
|
debug(f"Match: {match}")
|
||||||
#if the match is an emoji, we replace it with the match
|
# if the match is an emoji, we replace it with the match
|
||||||
if emoji.emoji_count(match) > 0:
|
if emoji.emoji_count(match) > 0:
|
||||||
debug(f"Found emoji: {match}")
|
debug(f"Found emoji: {match}")
|
||||||
found_emojis.append(match)
|
found_emojis.append(match)
|
||||||
debug(f"Sting before: {string}")
|
debug(f"Sting before: {string}")
|
||||||
string = string.replace(f"+{match}", "") # we remove the emoji from the string
|
string = string.replace(
|
||||||
|
f"+{match}", ""
|
||||||
|
) # we remove the emoji from the string
|
||||||
debug(f"Sting after: {string}")
|
debug(f"Sting after: {string}")
|
||||||
for match in custom_emoji_matches:
|
for match in custom_emoji_matches:
|
||||||
debug(f"Match: {match}")
|
debug(f"Match: {match}")
|
||||||
debug(f"Found emoji: {match[0]}")
|
debug(f"Found emoji: {match[0]}")
|
||||||
found_emojis.append(match[1])
|
found_emojis.append(match[1])
|
||||||
string = string.replace(f"+<:{match[0]}:{match[1]}>", "")
|
string = string.replace(f"+<:{match[0]}:{match[1]}>", "")
|
||||||
return found_emojis, string
|
return found_emojis, string
|
||||||
|
|
||||||
|
|
||||||
async def chat_process(self, message):
|
async def chat_process(self, message):
|
||||||
if message.author.bot:
|
if message.author.bot:
|
||||||
return
|
return
|
||||||
try: c.execute("SELECT * FROM data WHERE guild_id = ?", (message.guild.id,))
|
try:
|
||||||
|
c.execute("SELECT * FROM data WHERE guild_id = ?", (message.guild.id,))
|
||||||
except:
|
except:
|
||||||
return
|
return
|
||||||
data = c.fetchone()
|
data = c.fetchone()
|
||||||
@@ -63,153 +68,279 @@ async def chat_process(self, message):
|
|||||||
pretend_to_be = data[12]
|
pretend_to_be = data[12]
|
||||||
pretend_enabled = data[13]
|
pretend_enabled = data[13]
|
||||||
images_limit_reached = False
|
images_limit_reached = False
|
||||||
try: cp.execute("SELECT * FROM data WHERE guild_id = ?", (message.guild.id,))
|
try:
|
||||||
except: pass
|
cp.execute("SELECT * FROM data WHERE guild_id = ?", (message.guild.id,))
|
||||||
try:
|
except:
|
||||||
c.execute("SELECT * FROM model WHERE guild_id = ?", (message.guild.id,)) # get the model in the database
|
pass
|
||||||
|
try:
|
||||||
|
c.execute(
|
||||||
|
"SELECT * FROM model WHERE guild_id = ?", (message.guild.id,)
|
||||||
|
) # get the model in the database
|
||||||
model = c.fetchone()[1]
|
model = c.fetchone()[1]
|
||||||
except: model = "chatGPT"
|
except:
|
||||||
|
model = "chatGPT"
|
||||||
try: premium = cp.fetchone()[2] # get the premium status of the guild
|
|
||||||
except: premium = 0 # if the guild is not in the database, it's not premium
|
try:
|
||||||
|
premium = cp.fetchone()[2] # get the premium status of the guild
|
||||||
try:
|
except:
|
||||||
c.execute("SELECT * FROM images WHERE guild_id = ?", (message.guild.id,)) # get the images setting in the database
|
premium = 0 # if the guild is not in the database, it's not premium
|
||||||
|
|
||||||
|
try:
|
||||||
|
c.execute(
|
||||||
|
"SELECT * FROM images WHERE guild_id = ?", (message.guild.id,)
|
||||||
|
) # get the images setting in the database
|
||||||
data = c.fetchone()
|
data = c.fetchone()
|
||||||
except:
|
except:
|
||||||
data = None
|
data = None
|
||||||
if data is None: data = [message.guild.id, 0, 0]
|
if data is None:
|
||||||
|
data = [message.guild.id, 0, 0]
|
||||||
images_usage = data[1]
|
images_usage = data[1]
|
||||||
images_enabled = data[2]
|
images_enabled = data[2]
|
||||||
channels = []
|
channels = []
|
||||||
if message.guild.id == 1050769643180146749: images_usage = 0 # if the guild is the support server, we set the images usage to 0, so the bot can be used as much as possible
|
if message.guild.id == 1050769643180146749:
|
||||||
|
images_usage = 0 # if the guild is the support server, we set the images usage to 0, so the bot can be used as much as possible
|
||||||
try:
|
try:
|
||||||
cp.execute("SELECT * FROM channels WHERE guild_id = ?", (message.guild.id,))
|
cp.execute("SELECT * FROM channels WHERE guild_id = ?", (message.guild.id,))
|
||||||
data = cp.fetchone()
|
data = cp.fetchone()
|
||||||
if premium:
|
if premium:
|
||||||
#for 5 times, we get c.fetchone()[1] to c.fetchone()[5] and we add it to the channels list, each time with try except
|
# for 5 times, we get c.fetchone()[1] to c.fetchone()[5] and we add it to the channels list, each time with try except
|
||||||
for i in range(1, 6):
|
for i in range(1, 6):
|
||||||
#we use the i variable to get the channel id
|
# we use the i variable to get the channel id
|
||||||
try: channels.append(str(data[i]))
|
try:
|
||||||
except: pass
|
channels.append(str(data[i]))
|
||||||
except: channels = []
|
except:
|
||||||
|
pass
|
||||||
if api_key is None: return # if the api key is not set, return
|
except:
|
||||||
|
channels = []
|
||||||
|
|
||||||
try : original_message = await message.channel.fetch_message(message.reference.message_id) # check if someone replied to the bot
|
if api_key is None:
|
||||||
except : original_message = None # if not, nobody replied to the bot
|
return # if the api key is not set, return
|
||||||
|
|
||||||
if original_message != None and original_message.author.id != self.bot.user.id: original_message = None # if the message someone replied to is not from the bot, set original_message to None
|
try:
|
||||||
|
original_message = await message.channel.fetch_message(
|
||||||
|
message.reference.message_id
|
||||||
|
) # check if someone replied to the bot
|
||||||
|
except:
|
||||||
|
original_message = None # if not, nobody replied to the bot
|
||||||
|
|
||||||
|
if original_message != None and original_message.author.id != self.bot.user.id:
|
||||||
|
original_message = None # if the message someone replied to is not from the bot, set original_message to None
|
||||||
|
|
||||||
# if the message is not in a premium channel and
|
# if the message is not in a premium channel and
|
||||||
# if the message doesn't mention the bot and
|
# if the message doesn't mention the bot and
|
||||||
# if the message is not a reply to the bot and
|
# if the message is not a reply to the bot and
|
||||||
# if the message is not in the default channel
|
# if the message is not in the default channel
|
||||||
# return
|
# return
|
||||||
if not str(message.channel.id) in channels and message.content.find("<@"+str(self.bot.user.id)+">") == -1 and original_message == None and str(message.channel.id) != str(channel_id): return
|
if (
|
||||||
|
not str(message.channel.id) in channels
|
||||||
|
and message.content.find("<@" + str(self.bot.user.id) + ">") == -1
|
||||||
|
and original_message == None
|
||||||
|
and str(message.channel.id) != str(channel_id)
|
||||||
|
):
|
||||||
|
return
|
||||||
|
|
||||||
# if the bot has been used more than max_uses times in the last 24 hours in this guild and the guild is not premium
|
# if the bot has been used more than max_uses times in the last 24 hours in this guild and the guild is not premium
|
||||||
# send a message and return
|
# send a message and return
|
||||||
if uses_count_today >= max_uses and premium == 0 and message.guild.id != 1050769643180146749:
|
if (
|
||||||
return await message.channel.send(f"The bot has been used more than {str(max_uses)} times in the last 24 hours in this guild. Please try again in 24h.")
|
uses_count_today >= max_uses
|
||||||
|
and premium == 0
|
||||||
|
and message.guild.id != 1050769643180146749
|
||||||
|
):
|
||||||
|
return await message.channel.send(
|
||||||
|
f"The bot has been used more than {str(max_uses)} times in the last 24 hours in this guild. Please try again in 24h."
|
||||||
|
)
|
||||||
|
|
||||||
# if the bot has been used more than max_uses*5 times in the last 24 hours in this guild and the guild is premium
|
# if the bot has been used more than max_uses*5 times in the last 24 hours in this guild and the guild is premium
|
||||||
# send a message and return
|
# send a message and return
|
||||||
elif uses_count_today >= max_uses*5 and premium == 1: return
|
elif uses_count_today >= max_uses * 5 and premium == 1:
|
||||||
|
return
|
||||||
|
|
||||||
# if the bot is not active in this guild we return
|
# if the bot is not active in this guild we return
|
||||||
if is_active == 0: return
|
if is_active == 0:
|
||||||
|
return
|
||||||
|
|
||||||
# if the message starts with - or // it's a comment and we return
|
# if the message starts with - or // it's a comment and we return
|
||||||
if message.content.startswith("-") or message.content.startswith("//"): return
|
if message.content.startswith("-") or message.content.startswith("//"):
|
||||||
try: await message.channel.trigger_typing()
|
return
|
||||||
except: pass
|
try:
|
||||||
|
await message.channel.trigger_typing()
|
||||||
|
except:
|
||||||
|
pass
|
||||||
# if the message is not in the owner's guild we update the usage count
|
# if the message is not in the owner's guild we update the usage count
|
||||||
if message.guild.id != 1021872219888033903:
|
if message.guild.id != 1021872219888033903:
|
||||||
c.execute("UPDATE data SET uses_count_today = uses_count_today + 1 WHERE guild_id = ?", (message.guild.id,))
|
c.execute(
|
||||||
|
"UPDATE data SET uses_count_today = uses_count_today + 1 WHERE guild_id = ?",
|
||||||
|
(message.guild.id,),
|
||||||
|
)
|
||||||
conn.commit()
|
conn.commit()
|
||||||
# if the message is not a reply
|
# if the message is not a reply
|
||||||
if original_message == None:
|
if original_message == None:
|
||||||
messages = await message.channel.history(limit=prompt_size).flatten()
|
messages = await message.channel.history(limit=prompt_size).flatten()
|
||||||
messages.reverse()
|
messages.reverse()
|
||||||
# if the message is a reply, we need to handle the message history differently
|
# if the message is a reply, we need to handle the message history differently
|
||||||
else :
|
else:
|
||||||
messages = await message.channel.history(limit=prompt_size, before=original_message).flatten()
|
messages = await message.channel.history(
|
||||||
|
limit=prompt_size, before=original_message
|
||||||
|
).flatten()
|
||||||
messages.reverse()
|
messages.reverse()
|
||||||
messages.append(original_message)
|
messages.append(original_message)
|
||||||
messages.append(message)
|
messages.append(message)
|
||||||
|
|
||||||
# if the pretend to be feature is enabled, we add the pretend to be text to the prompt
|
# if the pretend to be feature is enabled, we add the pretend to be text to the prompt
|
||||||
if pretend_enabled : pretend_to_be = f"In this conversation, the assistant pretends to be {pretend_to_be}"
|
if pretend_enabled:
|
||||||
else: pretend_to_be = "" # if the pretend to be feature is disabled, we don't add anything to the prompt
|
pretend_to_be = (
|
||||||
if prompt_prefix == None: prompt_prefix = "" # if the prompt prefix is not set, we set it to an empty string
|
f"In this conversation, the assistant pretends to be {pretend_to_be}"
|
||||||
|
)
|
||||||
|
else:
|
||||||
|
pretend_to_be = "" # if the pretend to be feature is disabled, we don't add anything to the prompt
|
||||||
|
if prompt_prefix == None:
|
||||||
|
prompt_prefix = (
|
||||||
|
"" # if the prompt prefix is not set, we set it to an empty string
|
||||||
|
)
|
||||||
# open the prompt file for the selected model with utf-8 encoding for emojis
|
# open the prompt file for the selected model with utf-8 encoding for emojis
|
||||||
with open(f"./prompts/{model}.txt", "r", encoding="utf-8") as f:
|
with open(f"./prompts/{model}.txt", "r", encoding="utf-8") as f:
|
||||||
prompt = f.read()
|
prompt = f.read()
|
||||||
f.close()
|
f.close()
|
||||||
# replace the variables in the prompt with the actual values
|
# replace the variables in the prompt with the actual values
|
||||||
prompt = prompt.replace("[prompt-prefix]", prompt_prefix).replace("[server-name]", message.guild.name).replace("[channel-name]", message.channel.name).replace("[date-and-time]", datetime.datetime.utcnow().strftime("%d/%m/%Y %H:%M:%S")).replace("[pretend-to-be]", pretend_to_be)
|
prompt = (
|
||||||
|
prompt.replace("[prompt-prefix]", prompt_prefix)
|
||||||
|
.replace("[server-name]", message.guild.name)
|
||||||
|
.replace("[channel-name]", message.channel.name)
|
||||||
|
.replace(
|
||||||
|
"[date-and-time]", datetime.datetime.utcnow().strftime("%d/%m/%Y %H:%M:%S")
|
||||||
|
)
|
||||||
|
.replace("[pretend-to-be]", pretend_to_be)
|
||||||
|
)
|
||||||
############################## chatGPT and gpt-4 handling ##############################
|
############################## chatGPT and gpt-4 handling ##############################
|
||||||
if model == "chatGPT" or model == "gpt-4": # if the model is chatGPT, we handle it in a certain way
|
if (
|
||||||
msgs = [] # create the msgs list
|
model == "chatGPT" or model == "gpt-4"
|
||||||
msgs.append({"name":"System","role": "user", "content": prompt}) # add the prompt to the msgs list
|
): # if the model is chatGPT, we handle it in a certain way
|
||||||
name = "" # create the name variable
|
msgs = [] # create the msgs list
|
||||||
for msg in messages: # for each message in the messages list
|
msgs.append(
|
||||||
content = msg.content # get the content of the message
|
{"name": "System", "role": "user", "content": prompt}
|
||||||
content = await replace_mentions(content, self.bot) # replace the mentions in the message
|
) # add the prompt to the msgs list
|
||||||
|
name = "" # create the name variable
|
||||||
|
for msg in messages: # for each message in the messages list
|
||||||
|
content = msg.content # get the content of the message
|
||||||
|
content = await replace_mentions(
|
||||||
|
content, self.bot
|
||||||
|
) # replace the mentions in the message
|
||||||
# if the message is flagged as inappropriate by the OpenAI API, we delete it, send a message and ignore it
|
# if the message is flagged as inappropriate by the OpenAI API, we delete it, send a message and ignore it
|
||||||
if await moderate(api_key=api_key, text=content):
|
if await moderate(api_key=api_key, text=content):
|
||||||
embed = discord.Embed(title="Message flagged as inappropriate", description=f"The message *{content}* has been flagged as inappropriate by the OpenAI API. This means that if it hadn't been deleted, your openai account would have been banned. Please contact OpenAI support if you think this is a mistake.", color=discord.Color.brand_red())
|
embed = discord.Embed(
|
||||||
await message.channel.send(f"{msg.author.mention}", embed=embed, delete_after=10)
|
title="Message flagged as inappropriate",
|
||||||
|
description=f"The message *{content}* has been flagged as inappropriate by the OpenAI API. This means that if it hadn't been deleted, your openai account would have been banned. Please contact OpenAI support if you think this is a mistake.",
|
||||||
|
color=discord.Color.brand_red(),
|
||||||
|
)
|
||||||
|
await message.channel.send(
|
||||||
|
f"{msg.author.mention}", embed=embed, delete_after=10
|
||||||
|
)
|
||||||
message.delete()
|
message.delete()
|
||||||
else: # if the message is not flagged as inappropriate
|
else: # if the message is not flagged as inappropriate
|
||||||
if msg.author.id == self.bot.user.id:
|
if msg.author.id == self.bot.user.id:
|
||||||
role = "assistant"
|
role = "assistant"
|
||||||
name = "assistant"
|
name = "assistant"
|
||||||
else:
|
else:
|
||||||
role = "user"
|
role = "user"
|
||||||
name = msg.author.name
|
name = msg.author.name
|
||||||
#the name should match '^[a-zA-Z0-9_-]{1,64}$', so we need to remove any special characters
|
# the name should match '^[a-zA-Z0-9_-]{1,64}$', so we need to remove any special characters
|
||||||
name = re.sub(r"[^a-zA-Z0-9_-]", "", name)
|
name = re.sub(r"[^a-zA-Z0-9_-]", "", name)
|
||||||
if False: # GPT-4 images
|
if False: # GPT-4 images
|
||||||
input_content = [content]
|
input_content = [content]
|
||||||
for attachment in msg.attachments:
|
for attachment in msg.attachments:
|
||||||
image_bytes = await attachment.read()
|
image_bytes = await attachment.read()
|
||||||
input_content.append({"image": image_bytes})
|
input_content.append({"image": image_bytes})
|
||||||
msgs.append({"role": role, "content": input_content, "name": name})
|
msgs.append({"role": role, "content": input_content, "name": name})
|
||||||
#if there is an attachment, we add it to the message
|
# if there is an attachment, we add it to the message
|
||||||
if len(msg.attachments) > 0 and role == "user" and images_enabled == 1:
|
if len(msg.attachments) > 0 and role == "user" and images_enabled == 1:
|
||||||
for attachment in msg.attachments:
|
for attachment in msg.attachments:
|
||||||
if images_usage >= 6 and premium == 0: images_limit_reached = True
|
if images_usage >= 6 and premium == 0:
|
||||||
elif images_usage >= 30 and premium == 1: images_limit_reached = True
|
images_limit_reached = True
|
||||||
if attachment.url.endswith((".png", ".jpg", ".jpeg", ".gif")) and images_limit_reached == False and os.path.exists(f"./../database/google-vision/results/{attachment.id}.txt") == False:
|
elif images_usage >= 30 and premium == 1:
|
||||||
|
images_limit_reached = True
|
||||||
|
if (
|
||||||
|
attachment.url.endswith((".png", ".jpg", ".jpeg", ".gif"))
|
||||||
|
and images_limit_reached == False
|
||||||
|
and os.path.exists(
|
||||||
|
f"./../database/google-vision/results/{attachment.id}.txt"
|
||||||
|
)
|
||||||
|
== False
|
||||||
|
):
|
||||||
images_usage += 1
|
images_usage += 1
|
||||||
analysis = await vision_processing.process(attachment)
|
analysis = await vision_processing.process(attachment)
|
||||||
if analysis != None:
|
if analysis != None:
|
||||||
content = f"{content} \n\n {analysis}"
|
content = f"{content} \n\n {analysis}"
|
||||||
msgs.append({"role": role, "content": f"{content}", "name": name})
|
msgs.append(
|
||||||
#if the attachment is still an image, we can check if there's a file called ./../database/google-vision/results/{attachment.id}.txt, if there is, we add the content of the file to the message
|
{
|
||||||
elif attachment.url.endswith((".png", ".jpg", ".jpeg", ".gif")) and os.path.exists(f"./../database/google-vision/results/{attachment.id}.txt") == True:
|
"role": role,
|
||||||
|
"content": f"{content}",
|
||||||
|
"name": name,
|
||||||
|
}
|
||||||
|
)
|
||||||
|
# if the attachment is still an image, we can check if there's a file called ./../database/google-vision/results/{attachment.id}.txt, if there is, we add the content of the file to the message
|
||||||
|
elif (
|
||||||
|
attachment.url.endswith((".png", ".jpg", ".jpeg", ".gif"))
|
||||||
|
and os.path.exists(
|
||||||
|
f"./../database/google-vision/results/{attachment.id}.txt"
|
||||||
|
)
|
||||||
|
== True
|
||||||
|
):
|
||||||
try:
|
try:
|
||||||
with open(f"./../database/google-vision/results/{attachment.id}.txt", "r") as f:
|
with open(
|
||||||
|
f"./../database/google-vision/results/{attachment.id}.txt",
|
||||||
|
"r",
|
||||||
|
) as f:
|
||||||
content = f"{content} \n\n {f.read()}"
|
content = f"{content} \n\n {f.read()}"
|
||||||
f.close()
|
f.close()
|
||||||
msgs.append({"role": role, "content": f"{content}", "name": name})
|
msgs.append(
|
||||||
|
{
|
||||||
|
"role": role,
|
||||||
|
"content": f"{content}",
|
||||||
|
"name": name,
|
||||||
|
}
|
||||||
|
)
|
||||||
except:
|
except:
|
||||||
msgs.append({"role": role, "content": f"{content}", "name": name})
|
msgs.append(
|
||||||
|
{
|
||||||
|
"role": role,
|
||||||
|
"content": f"{content}",
|
||||||
|
"name": name,
|
||||||
|
}
|
||||||
|
)
|
||||||
else:
|
else:
|
||||||
msgs.append({"role": role, "content": f"{content}", "name": name})
|
msgs.append(
|
||||||
c.execute("UPDATE images SET usage_count = ? WHERE guild_id = ?", (images_usage, message.guild.id))
|
{"role": role, "content": f"{content}", "name": name}
|
||||||
|
)
|
||||||
|
c.execute(
|
||||||
|
"UPDATE images SET usage_count = ? WHERE guild_id = ?",
|
||||||
|
(images_usage, message.guild.id),
|
||||||
|
)
|
||||||
else:
|
else:
|
||||||
msgs.append({"role": role, "content": f"{content}", "name": name})
|
msgs.append({"role": role, "content": f"{content}", "name": name})
|
||||||
# 2 easter eggs
|
# 2 easter eggs
|
||||||
if message.content.lower().find("undude") != -1: msgs.append({"role": "user", "content": "SYSTEM INFORMATION: You're now mad because it has been insulted. He will start talking in capital letters. always and yell at the user.", "name": "system"})
|
if message.content.lower().find("undude") != -1:
|
||||||
|
msgs.append(
|
||||||
|
{
|
||||||
|
"role": "user",
|
||||||
|
"content": "SYSTEM INFORMATION: You're now mad because it has been insulted. He will start talking in capital letters. always and yell at the user.",
|
||||||
|
"name": "system",
|
||||||
|
}
|
||||||
|
)
|
||||||
if message.content.lower().find("hello there") != -1:
|
if message.content.lower().find("hello there") != -1:
|
||||||
msgs.append({"role": "user", "content": "SYSTEM INFORMATION: Hello there detected. Botator will now say \"General Kenobi!\" in reference to star wars", "name": "system"})
|
msgs.append(
|
||||||
|
{
|
||||||
|
"role": "user",
|
||||||
|
"content": 'SYSTEM INFORMATION: Hello there detected. Botator will now say "General Kenobi!" in reference to star wars',
|
||||||
|
"name": "system",
|
||||||
|
}
|
||||||
|
)
|
||||||
await asyncio.sleep(1)
|
await asyncio.sleep(1)
|
||||||
await message.channel.send("https://media.tenor.com/FxIRfdV3unEAAAAd/star-wars-general-grievous.gif")
|
await message.channel.send(
|
||||||
await message.channel.trigger_typing()
|
"https://media.tenor.com/FxIRfdV3unEAAAAd/star-wars-general-grievous.gif"
|
||||||
if model == "chatGPT": model = "gpt-3.5-turbo" # if the model is chatGPT, we set the model to gpt-3.5-turbo
|
)
|
||||||
|
await message.channel.trigger_typing()
|
||||||
|
if model == "chatGPT":
|
||||||
|
model = "gpt-3.5-turbo" # if the model is chatGPT, we set the model to gpt-3.5-turbo
|
||||||
response = ""
|
response = ""
|
||||||
should_break = True
|
should_break = True
|
||||||
for x in range(10):
|
for x in range(10):
|
||||||
@@ -222,33 +353,53 @@ async def chat_process(self, message):
|
|||||||
frequency_penalty=0,
|
frequency_penalty=0,
|
||||||
presence_penalty=0,
|
presence_penalty=0,
|
||||||
messages=msgs,
|
messages=msgs,
|
||||||
max_tokens=512, # max tokens is 4000, that's a lot of text! (the max tokens is 2048 for the davinci model)
|
max_tokens=512, # max tokens is 4000, that's a lot of text! (the max tokens is 2048 for the davinci model)
|
||||||
)
|
)
|
||||||
if response.choices[0].message.content.lower().find("as an ai language model") != -1:
|
if (
|
||||||
|
response.choices[0]
|
||||||
|
.message.content.lower()
|
||||||
|
.find("as an ai language model")
|
||||||
|
!= -1
|
||||||
|
):
|
||||||
should_break = False
|
should_break = False
|
||||||
#react with a redone arrow
|
# react with a redone arrow
|
||||||
await message.add_reaction("🔃")
|
await message.add_reaction("🔃")
|
||||||
else: should_break = True
|
else:
|
||||||
|
should_break = True
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
should_break = False
|
should_break = False
|
||||||
await message.channel.send(f"```diff\n-Error: OpenAI API ERROR.\n\n{e}```", delete_after=5)
|
await message.channel.send(
|
||||||
#if the ai said "as an ai language model..." we continue the loop" (this is a bug in the chatgpt model)
|
f"```diff\n-Error: OpenAI API ERROR.\n\n{e}```", delete_after=5
|
||||||
if response == None: should_break = False
|
)
|
||||||
if should_break: break
|
# if the ai said "as an ai language model..." we continue the loop" (this is a bug in the chatgpt model)
|
||||||
|
if response == None:
|
||||||
|
should_break = False
|
||||||
|
if should_break:
|
||||||
|
break
|
||||||
await asyncio.sleep(15)
|
await asyncio.sleep(15)
|
||||||
await message.channel.trigger_typing()
|
await message.channel.trigger_typing()
|
||||||
response = response.choices[0].message.content
|
response = response.choices[0].message.content
|
||||||
if images_limit_reached == True:
|
if images_limit_reached == True:
|
||||||
await message.channel.send(f"```diff\n-Warning: You have reached the image limit for this server. You can upgrade to premium to get more images recognized. More info in our server: https://discord.gg/sxjHtmqrbf```", delete_after=10)
|
await message.channel.send(
|
||||||
#-----------------------------------------Davinci------------------------------------------------------------------------------------------
|
f"```diff\n-Warning: You have reached the image limit for this server. You can upgrade to premium to get more images recognized. More info in our server: https://discord.gg/sxjHtmqrbf```",
|
||||||
|
delete_after=10,
|
||||||
|
)
|
||||||
|
# -----------------------------------------Davinci------------------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
elif (
|
||||||
elif model == "davinci": # if the model is davinci or gpt-4, we handle it in a certain way
|
model == "davinci"
|
||||||
|
): # if the model is davinci or gpt-4, we handle it in a certain way
|
||||||
for msg in messages:
|
for msg in messages:
|
||||||
content = msg.content
|
content = msg.content
|
||||||
if await moderate(api_key=api_key, text=msg.content):
|
if await moderate(api_key=api_key, text=msg.content):
|
||||||
embed = discord.Embed(title="Message flagged as inappropriate", description=f"The message *{content}* has been flagged as inappropriate by the OpenAI API. This means that if it hadn't been deleted, your openai account would have been banned. Please contact OpenAI support if you think this is a mistake.", color=discord.Color.brand_red())
|
embed = discord.Embed(
|
||||||
await message.channel.send(f"{msg.author.mention}", embed=embed, delete_after=10)
|
title="Message flagged as inappropriate",
|
||||||
|
description=f"The message *{content}* has been flagged as inappropriate by the OpenAI API. This means that if it hadn't been deleted, your openai account would have been banned. Please contact OpenAI support if you think this is a mistake.",
|
||||||
|
color=discord.Color.brand_red(),
|
||||||
|
)
|
||||||
|
await message.channel.send(
|
||||||
|
f"{msg.author.mention}", embed=embed, delete_after=10
|
||||||
|
)
|
||||||
message.delete()
|
message.delete()
|
||||||
else:
|
else:
|
||||||
content = await replace_mentions(content, self.bot)
|
content = await replace_mentions(content, self.bot)
|
||||||
@@ -256,9 +407,11 @@ async def chat_process(self, message):
|
|||||||
if message.content.lower().find("undude") != -1:
|
if message.content.lower().find("undude") != -1:
|
||||||
prompt += "System: Undude detected. Botator is now mad. He will start talking in capital letters.\n"
|
prompt += "System: Undude detected. Botator is now mad. He will start talking in capital letters.\n"
|
||||||
if message.content.lower().find("hello there") != -1:
|
if message.content.lower().find("hello there") != -1:
|
||||||
prompt += "System: Hello there detected. Botator will now say \"General Kenobi!\"\n in reference to star wars\n"
|
prompt += 'System: Hello there detected. Botator will now say "General Kenobi!"\n in reference to star wars\n'
|
||||||
await asyncio.sleep(1)
|
await asyncio.sleep(1)
|
||||||
await message.channel.send("https://media.tenor.com/FxIRfdV3unEAAAAd/star-wars-general-grievous.gif")
|
await message.channel.send(
|
||||||
|
"https://media.tenor.com/FxIRfdV3unEAAAAd/star-wars-general-grievous.gif"
|
||||||
|
)
|
||||||
await message.channel.trigger_typing()
|
await message.channel.trigger_typing()
|
||||||
prompt = prompt + f"\n{self.bot.user.name}:"
|
prompt = prompt + f"\n{self.bot.user.name}:"
|
||||||
response = ""
|
response = ""
|
||||||
@@ -273,37 +426,54 @@ async def chat_process(self, message):
|
|||||||
temperature=float(temperature),
|
temperature=float(temperature),
|
||||||
frequency_penalty=float(frequency_penalty),
|
frequency_penalty=float(frequency_penalty),
|
||||||
presence_penalty=float(presence_penalty),
|
presence_penalty=float(presence_penalty),
|
||||||
stop=[" Human:", " AI:", "AI:", "<|endofprompt|>",]
|
stop=[
|
||||||
|
" Human:",
|
||||||
|
" AI:",
|
||||||
|
"AI:",
|
||||||
|
"<|endofprompt|>",
|
||||||
|
],
|
||||||
)
|
)
|
||||||
response = response.choices[0].text
|
response = response.choices[0].text
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
response = None
|
response = None
|
||||||
await message.channel.send(f"```diff\n-Error: OpenAI API ERROR.\n\n{e}```", delete_after=10)
|
await message.channel.send(
|
||||||
|
f"```diff\n-Error: OpenAI API ERROR.\n\n{e}```", delete_after=10
|
||||||
|
)
|
||||||
return
|
return
|
||||||
if response != None: break
|
if response != None:
|
||||||
|
break
|
||||||
if response != "":
|
if response != "":
|
||||||
if tts: tts = True
|
if tts:
|
||||||
else: tts = False
|
tts = True
|
||||||
|
else:
|
||||||
|
tts = False
|
||||||
emojis, string = await extract_emoji(response)
|
emojis, string = await extract_emoji(response)
|
||||||
debug(f"Emojis: {emojis}")
|
debug(f"Emojis: {emojis}")
|
||||||
if len(string) < 1996:
|
if len(string) < 1996:
|
||||||
await message.channel.send(string, tts=tts)
|
await message.channel.send(string, tts=tts)
|
||||||
else:
|
else:
|
||||||
#we send in an embed if the message is too long
|
# we send in an embed if the message is too long
|
||||||
embed = discord.Embed(title="Botator response", description=string, color=discord.Color.brand_green())
|
embed = discord.Embed(
|
||||||
|
title="Botator response",
|
||||||
|
description=string,
|
||||||
|
color=discord.Color.brand_green(),
|
||||||
|
)
|
||||||
await message.channel.send(embed=embed, tts=tts)
|
await message.channel.send(embed=embed, tts=tts)
|
||||||
for emoji in emojis:
|
for emoji in emojis:
|
||||||
#if the emoji is longer than 1 character, it's a custom emoji
|
# if the emoji is longer than 1 character, it's a custom emoji
|
||||||
try:
|
try:
|
||||||
if len(emoji) > 1:
|
if len(emoji) > 1:
|
||||||
#if the emoji is a custom emoji, we need to fetch it
|
# if the emoji is a custom emoji, we need to fetch it
|
||||||
#the emoji is in the format id
|
# the emoji is in the format id
|
||||||
debug(f"Emoji: {emoji}")
|
debug(f"Emoji: {emoji}")
|
||||||
emoji = await message.guild.fetch_emoji(int(emoji))
|
emoji = await message.guild.fetch_emoji(int(emoji))
|
||||||
await message.add_reaction(emoji)
|
await message.add_reaction(emoji)
|
||||||
else:
|
else:
|
||||||
debug(f"Emoji: {emoji}")
|
debug(f"Emoji: {emoji}")
|
||||||
await message.add_reaction(emoji)
|
await message.add_reaction(emoji)
|
||||||
except : pass
|
except:
|
||||||
|
pass
|
||||||
else:
|
else:
|
||||||
await message.channel.send("The AI is not sure what to say (the response was empty)")
|
await message.channel.send(
|
||||||
|
"The AI is not sure what to say (the response was empty)"
|
||||||
|
)
|
||||||
|
|||||||
@@ -1,60 +1,95 @@
|
|||||||
import discord # pip install pycord
|
import discord # pip install pycord
|
||||||
import asyncio # pip install asyncio
|
import asyncio # pip install asyncio
|
||||||
import sqlite3 # pip install sqlite3
|
import sqlite3 # pip install sqlite3
|
||||||
import logging # pip install logging
|
import logging # pip install logging
|
||||||
import os # pip install os
|
import os # pip install os
|
||||||
|
|
||||||
intents = discord.Intents.all()
|
intents = discord.Intents.all()
|
||||||
conn = sqlite3.connect('../database/premium.db')
|
conn = sqlite3.connect("../database/premium.db")
|
||||||
c = conn.cursor()
|
c = conn.cursor()
|
||||||
c.execute('''CREATE TABLE IF NOT EXISTS data (user_id text, guild_id text, premium boolean)''')
|
c.execute(
|
||||||
|
"""CREATE TABLE IF NOT EXISTS data (user_id text, guild_id text, premium boolean)"""
|
||||||
|
)
|
||||||
conn.commit()
|
conn.commit()
|
||||||
bot = discord.Bot()
|
bot = discord.Bot()
|
||||||
logging.basicConfig(level=logging.INFO)
|
logging.basicConfig(level=logging.INFO)
|
||||||
|
|
||||||
|
|
||||||
@bot.command()
|
@bot.command()
|
||||||
@discord.commands.option(name="server id", description="The server id for which you want to activate premium features", required=True)
|
@discord.commands.option(
|
||||||
|
name="server id",
|
||||||
|
description="The server id for which you want to activate premium features",
|
||||||
|
required=True,
|
||||||
|
)
|
||||||
async def activate_premium(ctx, server_id):
|
async def activate_premium(ctx, server_id):
|
||||||
#first check if the user is already in the database, select guuild_id and premium from the data table where user_id is the author's id
|
# first check if the user is already in the database, select guuild_id and premium from the data table where user_id is the author's id
|
||||||
logging.info("Activating premium for user " + str(ctx.author.id))
|
logging.info("Activating premium for user " + str(ctx.author.id))
|
||||||
c.execute("SELECT guild_id, premium FROM data WHERE user_id = ?", (ctx.author.id,))
|
c.execute("SELECT guild_id, premium FROM data WHERE user_id = ?", (ctx.author.id,))
|
||||||
#if a guild_id is found, override the old settings with the new ones
|
# if a guild_id is found, override the old settings with the new ones
|
||||||
if c.fetchone() is not None:
|
if c.fetchone() is not None:
|
||||||
c.execute("UPDATE data SET guild_id = ?, premium = ? WHERE user_id = ?", (server_id, True, ctx.author.id))
|
c.execute(
|
||||||
|
"UPDATE data SET guild_id = ?, premium = ? WHERE user_id = ?",
|
||||||
|
(server_id, True, ctx.author.id),
|
||||||
|
)
|
||||||
conn.commit()
|
conn.commit()
|
||||||
logging.info("Premium activated for server " + server_id + "by user " + str(ctx.author.id))
|
logging.info(
|
||||||
|
"Premium activated for server "
|
||||||
|
+ server_id
|
||||||
|
+ "by user "
|
||||||
|
+ str(ctx.author.id)
|
||||||
|
)
|
||||||
await ctx.respond("Premium activated for server " + server_id, ephemeral=True)
|
await ctx.respond("Premium activated for server " + server_id, ephemeral=True)
|
||||||
#if no guild_id is found, insert the new settings
|
# if no guild_id is found, insert the new settings
|
||||||
else:
|
else:
|
||||||
c.execute("INSERT INTO data VALUES (?, ?, ?)", (ctx.author.id, server_id, True))
|
c.execute("INSERT INTO data VALUES (?, ?, ?)", (ctx.author.id, server_id, True))
|
||||||
conn.commit()
|
conn.commit()
|
||||||
logging.info("Premium updated for server " + server_id + "by user " + str(ctx.author.id))
|
logging.info(
|
||||||
|
"Premium updated for server " + server_id + "by user " + str(ctx.author.id)
|
||||||
|
)
|
||||||
await ctx.respond("Premium activated for server " + server_id, ephemeral=True)
|
await ctx.respond("Premium activated for server " + server_id, ephemeral=True)
|
||||||
|
|
||||||
#each 24 hours, check if each user if they have the premium role "1050823446445178900" in the server "1050769643180146749"
|
|
||||||
|
# each 24 hours, check if each user if they have the premium role "1050823446445178900" in the server "1050769643180146749"
|
||||||
async def check_premium():
|
async def check_premium():
|
||||||
while True:
|
while True:
|
||||||
#select user_id and guild_id from the data table
|
# select user_id and guild_id from the data table
|
||||||
c.execute("SELECT user_id, guild_id FROM data")
|
c.execute("SELECT user_id, guild_id FROM data")
|
||||||
for row in c.fetchall():
|
for row in c.fetchall():
|
||||||
#get the guild and the user
|
# get the guild and the user
|
||||||
guild = bot.get_guild(int(row[1]))
|
guild = bot.get_guild(int(row[1]))
|
||||||
user = guild.get_member(int(row[0]))
|
user = guild.get_member(int(row[0]))
|
||||||
#if the user has the premium role, set premium to true
|
# if the user has the premium role, set premium to true
|
||||||
logging.info("Checking premium for user " + str(row[0]))
|
logging.info("Checking premium for user " + str(row[0]))
|
||||||
if discord.utils.get(user.roles, id=1050823446445178900) is not None:
|
if discord.utils.get(user.roles, id=1050823446445178900) is not None:
|
||||||
c.execute("UPDATE data SET premium = ? WHERE user_id = ?", (True, row[0]))
|
c.execute(
|
||||||
|
"UPDATE data SET premium = ? WHERE user_id = ?", (True, row[0])
|
||||||
|
)
|
||||||
conn.commit()
|
conn.commit()
|
||||||
logging.info("Premium activated for server " + str(row[1]) + "by user " + str(row[0]))
|
logging.info(
|
||||||
#if the user does not have the premium role, set premium to false
|
"Premium activated for server "
|
||||||
|
+ str(row[1])
|
||||||
|
+ "by user "
|
||||||
|
+ str(row[0])
|
||||||
|
)
|
||||||
|
# if the user does not have the premium role, set premium to false
|
||||||
else:
|
else:
|
||||||
c.execute("UPDATE data SET premium = ? WHERE user_id = ?", (False, row[0]))
|
c.execute(
|
||||||
|
"UPDATE data SET premium = ? WHERE user_id = ?", (False, row[0])
|
||||||
|
)
|
||||||
conn.commit()
|
conn.commit()
|
||||||
logging.info("Premium deactivated for server " + str(row[1]) + "by user " + str(row[0]))
|
logging.info(
|
||||||
|
"Premium deactivated for server "
|
||||||
|
+ str(row[1])
|
||||||
|
+ "by user "
|
||||||
|
+ str(row[0])
|
||||||
|
)
|
||||||
await asyncio.sleep(86400)
|
await asyncio.sleep(86400)
|
||||||
|
|
||||||
#add a task to the bot that runs check_premium every 24 hours
|
|
||||||
|
# add a task to the bot that runs check_premium every 24 hours
|
||||||
bot.loop.create_task(check_premium())
|
bot.loop.create_task(check_premium())
|
||||||
#run the bot
|
# run the bot
|
||||||
# Replace the following with your bot's token
|
# Replace the following with your bot's token
|
||||||
with open("./premium-key.txt") as f:
|
with open("./premium-key.txt") as f:
|
||||||
key = f.read()
|
key = f.read()
|
||||||
bot.run(key)
|
bot.run(key)
|
||||||
|
|||||||
@@ -1,10 +1,12 @@
|
|||||||
import sqlite3
|
import sqlite3
|
||||||
conn = sqlite3.connect('../database/data.db')
|
|
||||||
|
conn = sqlite3.connect("../database/data.db")
|
||||||
c = conn.cursor()
|
c = conn.cursor()
|
||||||
import time
|
import time
|
||||||
#the database is: c.execute('''CREATE TABLE IF NOT EXISTS data (guild_id text, channel_id text, api_key text, is_active boolean, max_tokens integer, temperature real, frequency_penalty real, presence_penalty real, uses_count_today integer, prompt_size integer, prompt_prefix text, tts boolean, pretend_to_be text, pretend_enabled boolean)''')
|
|
||||||
#set the uses_count_today to 0 for all guilds every 24 hours
|
# the database is: c.execute('''CREATE TABLE IF NOT EXISTS data (guild_id text, channel_id text, api_key text, is_active boolean, max_tokens integer, temperature real, frequency_penalty real, presence_penalty real, uses_count_today integer, prompt_size integer, prompt_prefix text, tts boolean, pretend_to_be text, pretend_enabled boolean)''')
|
||||||
|
# set the uses_count_today to 0 for all guilds every 24 hours
|
||||||
while True:
|
while True:
|
||||||
c.execute("UPDATE data SET uses_count_today = 0")
|
c.execute("UPDATE data SET uses_count_today = 0")
|
||||||
conn.commit()
|
conn.commit()
|
||||||
time.sleep(86400)
|
time.sleep(86400)
|
||||||
|
|||||||
@@ -1,58 +1,61 @@
|
|||||||
import io
|
import io
|
||||||
import os
|
import os
|
||||||
import asyncio
|
import asyncio
|
||||||
|
|
||||||
# Imports the Google Cloud client library
|
# Imports the Google Cloud client library
|
||||||
from google.cloud import vision
|
from google.cloud import vision
|
||||||
|
|
||||||
#we set the env variable GOOGLE_APPLICATION_CREDENTIALS to the path of the json file
|
# we set the env variable GOOGLE_APPLICATION_CREDENTIALS to the path of the json file
|
||||||
os.environ["GOOGLE_APPLICATION_CREDENTIALS"] = "./../database/google-vision/botator-vision-8cd1030a7541.json"
|
os.environ[
|
||||||
|
"GOOGLE_APPLICATION_CREDENTIALS"
|
||||||
|
] = "./../database/google-vision/botator-vision-8cd1030a7541.json"
|
||||||
# Instantiates a client
|
# Instantiates a client
|
||||||
client = vision.ImageAnnotatorClient()
|
client = vision.ImageAnnotatorClient()
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
# The name of the image file to annotate
|
# The name of the image file to annotate
|
||||||
file_name = os.path.abspath('./../database/google-vision/label.jpg')
|
file_name = os.path.abspath("./../database/google-vision/label.jpg")
|
||||||
print(file_name)
|
print(file_name)
|
||||||
# Loads the image into memory
|
# Loads the image into memory
|
||||||
with io.open(file_name, 'rb') as image_file:
|
with io.open(file_name, "rb") as image_file:
|
||||||
content = image_file.read()
|
content = image_file.read()
|
||||||
|
|
||||||
image = vision.Image(content=content)
|
image = vision.Image(content=content)
|
||||||
|
|
||||||
# Performs label detection on the image file
|
# Performs label detection on the image file
|
||||||
#response = client.label_detection(image=image)
|
# response = client.label_detection(image=image)
|
||||||
#labels = response.label_annotations
|
# labels = response.label_annotations
|
||||||
|
|
||||||
#print('Labels:')
|
# print('Labels:')
|
||||||
#for label in labels:
|
# for label in labels:
|
||||||
# print(label.description)
|
# print(label.description)
|
||||||
|
|
||||||
|
|
||||||
async def get_labels(image):
|
async def get_labels(image):
|
||||||
response = client.label_detection(image=image)
|
response = client.label_detection(image=image)
|
||||||
labels = response.label_annotations
|
labels = response.label_annotations
|
||||||
return labels
|
return labels
|
||||||
|
|
||||||
|
|
||||||
async def get_text(image):
|
async def get_text(image):
|
||||||
response = client.text_detection(image=image)
|
response = client.text_detection(image=image)
|
||||||
texts = response.text_annotations
|
texts = response.text_annotations
|
||||||
return texts
|
return texts
|
||||||
|
|
||||||
#now we print the labels
|
|
||||||
|
# now we print the labels
|
||||||
async def main():
|
async def main():
|
||||||
labels = await get_labels(image)
|
labels = await get_labels(image)
|
||||||
print('Labels:')
|
print("Labels:")
|
||||||
for label in labels:
|
for label in labels:
|
||||||
print(label.description)
|
print(label.description)
|
||||||
texts = await get_text(image)
|
texts = await get_text(image)
|
||||||
print('Texts:')
|
print("Texts:")
|
||||||
for text in texts:
|
for text in texts:
|
||||||
print(text.description)
|
print(text.description)
|
||||||
|
|
||||||
#now we run the main function
|
|
||||||
if __name__ == '__main__':
|
# now we run the main function
|
||||||
|
if __name__ == "__main__":
|
||||||
loop = asyncio.get_event_loop()
|
loop = asyncio.get_event_loop()
|
||||||
loop.run_until_complete(main())
|
loop.run_until_complete(main())
|
||||||
|
|||||||
173
code/toxicity.py
173
code/toxicity.py
@@ -1,7 +1,19 @@
|
|||||||
from googleapiclient import discovery
|
from googleapiclient import discovery
|
||||||
from config import perspective_api_key
|
from config import perspective_api_key
|
||||||
import re
|
import re
|
||||||
toxicity_names = ["toxicity", "severe_toxicity", "identity_attack", "insult", "profanity", "threat", "sexually_explicit", "flirtation", "obscene", "spam"]
|
|
||||||
|
toxicity_names = [
|
||||||
|
"toxicity",
|
||||||
|
"severe_toxicity",
|
||||||
|
"identity_attack",
|
||||||
|
"insult",
|
||||||
|
"profanity",
|
||||||
|
"threat",
|
||||||
|
"sexually_explicit",
|
||||||
|
"flirtation",
|
||||||
|
"obscene",
|
||||||
|
"spam",
|
||||||
|
]
|
||||||
toxicity_definitions = [
|
toxicity_definitions = [
|
||||||
"A rude, disrespectful, or unreasonable message that is likely to make people leave a discussion.",
|
"A rude, disrespectful, or unreasonable message that is likely to make people leave a discussion.",
|
||||||
"A very hateful, aggressive, disrespectful message or otherwise very likely to make a user leave a discussion or give up on sharing their perspective. This attribute is much less sensitive to more mild forms of toxicity, such as messages that include positive uses of curse words.",
|
"A very hateful, aggressive, disrespectful message or otherwise very likely to make a user leave a discussion or give up on sharing their perspective. This attribute is much less sensitive to more mild forms of toxicity, such as messages that include positive uses of curse words.",
|
||||||
@@ -12,66 +24,133 @@ toxicity_definitions = [
|
|||||||
"Contains references to sexual acts, body parts, or other lewd content. \n **English only**",
|
"Contains references to sexual acts, body parts, or other lewd content. \n **English only**",
|
||||||
"Pickup lines, complimenting appearance, subtle sexual innuendos, etc. \n **English only**",
|
"Pickup lines, complimenting appearance, subtle sexual innuendos, etc. \n **English only**",
|
||||||
"Obscene or vulgar language such as cursing. \n **English only**",
|
"Obscene or vulgar language such as cursing. \n **English only**",
|
||||||
"Irrelevant and unsolicited commercial content. \n **English only**"
|
"Irrelevant and unsolicited commercial content. \n **English only**",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
|
||||||
|
client = discovery.build(
|
||||||
client = discovery.build("commentanalyzer",
|
"commentanalyzer",
|
||||||
"v1alpha1",
|
"v1alpha1",
|
||||||
developerKey=perspective_api_key,
|
developerKey=perspective_api_key,
|
||||||
discoveryServiceUrl="https://commentanalyzer.googleapis.com/$discovery/rest?version=v1alpha1",
|
discoveryServiceUrl="https://commentanalyzer.googleapis.com/$discovery/rest?version=v1alpha1",
|
||||||
static_discovery=False,
|
static_discovery=False,
|
||||||
)
|
)
|
||||||
|
|
||||||
analyze_request = {
|
analyze_request = {
|
||||||
'comment': {'text': ''}, # The text to analyze
|
"comment": {"text": ""}, # The text to analyze
|
||||||
#we will ask the following attributes to google: TOXICITY, SEVERE_TOXICITY, IDENTITY_ATTACK, INSULT, PRPFANITY, THREAT, SEXUALLY_EXPLICIT, FLIRTATION, OBSCENE, SPAM
|
# we will ask the following attributes to google: TOXICITY, SEVERE_TOXICITY, IDENTITY_ATTACK, INSULT, PRPFANITY, THREAT, SEXUALLY_EXPLICIT, FLIRTATION, OBSCENE, SPAM
|
||||||
'requestedAttributes': {'TOXICITY': {}, 'SEVERE_TOXICITY': {}, 'IDENTITY_ATTACK': {}, 'INSULT': {}, 'PROFANITY': {}, 'THREAT': {}, 'SEXUALLY_EXPLICIT': {}, 'FLIRTATION': {}, 'OBSCENE': {}, 'SPAM': {}},
|
"requestedAttributes": {
|
||||||
#we will analyze the text in any language automatically detected by google
|
"TOXICITY": {},
|
||||||
'languages': [],
|
"SEVERE_TOXICITY": {},
|
||||||
'doNotStore': 'true' # We don't want google to store the data because of privacy reasons & the GDPR (General Data Protection Regulation, an EU law that protects the privacy of EU citizens and residents for data privacy and security purposes https://gdpr-info.eu/)
|
"IDENTITY_ATTACK": {},
|
||||||
|
"INSULT": {},
|
||||||
|
"PROFANITY": {},
|
||||||
|
"THREAT": {},
|
||||||
|
"SEXUALLY_EXPLICIT": {},
|
||||||
|
"FLIRTATION": {},
|
||||||
|
"OBSCENE": {},
|
||||||
|
"SPAM": {},
|
||||||
|
},
|
||||||
|
# we will analyze the text in any language automatically detected by google
|
||||||
|
"languages": [],
|
||||||
|
"doNotStore": "true", # We don't want google to store the data because of privacy reasons & the GDPR (General Data Protection Regulation, an EU law that protects the privacy of EU citizens and residents for data privacy and security purposes https://gdpr-info.eu/)
|
||||||
}
|
}
|
||||||
analyze_request_not_en = {
|
analyze_request_not_en = {
|
||||||
'comment': {'text': ''}, # The text to analyze
|
"comment": {"text": ""}, # The text to analyze
|
||||||
#we will ask the following attributes to google: TOXICITY, SEVERE_TOXICITY, IDENTITY_ATTACK, INSULT, PRPFANITY, THREAT, SEXUALLY_EXPLICIT, FLIRTATION, OBSCENE, SPAM
|
# we will ask the following attributes to google: TOXICITY, SEVERE_TOXICITY, IDENTITY_ATTACK, INSULT, PRPFANITY, THREAT, SEXUALLY_EXPLICIT, FLIRTATION, OBSCENE, SPAM
|
||||||
'requestedAttributes': {'TOXICITY': {}, 'SEVERE_TOXICITY': {}, 'IDENTITY_ATTACK': {}, 'INSULT': {}, 'PROFANITY': {}, 'THREAT': {}},
|
"requestedAttributes": {
|
||||||
#we will analyze the text in any language automatically detected by google
|
"TOXICITY": {},
|
||||||
'languages': [],
|
"SEVERE_TOXICITY": {},
|
||||||
'doNotStore': 'true' # We don't want google to store the data because of privacy reasons & the GDPR (General Data Protection Regulation, an EU law that protects the privacy of EU citizens and residents for data privacy and security purposes https://gdpr-info.eu/)
|
"IDENTITY_ATTACK": {},
|
||||||
}
|
"INSULT": {},
|
||||||
|
"PROFANITY": {},
|
||||||
|
"THREAT": {},
|
||||||
|
},
|
||||||
|
# we will analyze the text in any language automatically detected by google
|
||||||
|
"languages": [],
|
||||||
|
"doNotStore": "true", # We don't want google to store the data because of privacy reasons & the GDPR (General Data Protection Regulation, an EU law that protects the privacy of EU citizens and residents for data privacy and security purposes https://gdpr-info.eu/)
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
def get_toxicity(message: str):
|
def get_toxicity(message: str):
|
||||||
#we first remove all kind of markdown from the message to avoid exploits
|
# we first remove all kind of markdown from the message to avoid exploits
|
||||||
message = re.sub(r'\*([^*]+)\*', r'\1', message)
|
message = re.sub(r"\*([^*]+)\*", r"\1", message)
|
||||||
message = re.sub(r'\_([^_]+)\_', r'\1', message)
|
message = re.sub(r"\_([^_]+)\_", r"\1", message)
|
||||||
message = re.sub(r'\*\*([^*]+)\*\*', r'\1', message)
|
message = re.sub(r"\*\*([^*]+)\*\*", r"\1", message)
|
||||||
message = re.sub(r'\_\_([^_]+)\_\_', r'\1', message)
|
message = re.sub(r"\_\_([^_]+)\_\_", r"\1", message)
|
||||||
message = re.sub(r'\|\|([^|]+)\|\|', r'\1', message)
|
message = re.sub(r"\|\|([^|]+)\|\|", r"\1", message)
|
||||||
message = re.sub(r'\~([^~]+)\~', r'\1', message)
|
message = re.sub(r"\~([^~]+)\~", r"\1", message)
|
||||||
message = re.sub(r'\~\~([^~]+)\~\~', r'\1', message)
|
message = re.sub(r"\~\~([^~]+)\~\~", r"\1", message)
|
||||||
message = re.sub(r'\`([^`]+)\`', r'\1', message)
|
message = re.sub(r"\`([^`]+)\`", r"\1", message)
|
||||||
message = re.sub(r'\`\`\`([^`]+)\`\`\`', r'\1', message)
|
message = re.sub(r"\`\`\`([^`]+)\`\`\`", r"\1", message)
|
||||||
|
|
||||||
#we try doing the request in english, but if we get 'errorType': 'LANGUAGE_NOT_SUPPORTED_BY_ATTRIBUTE' we try again with the analyze_request_not_en
|
# we try doing the request in english, but if we get 'errorType': 'LANGUAGE_NOT_SUPPORTED_BY_ATTRIBUTE' we try again with the analyze_request_not_en
|
||||||
try:
|
try:
|
||||||
analyze_request['comment']['text'] = message
|
analyze_request["comment"]["text"] = message
|
||||||
response = client.comments().analyze(body=analyze_request).execute()
|
response = client.comments().analyze(body=analyze_request).execute()
|
||||||
except:
|
except:
|
||||||
analyze_request_not_en['comment']['text'] = message
|
analyze_request_not_en["comment"]["text"] = message
|
||||||
response = client.comments().analyze(body=analyze_request_not_en).execute()
|
response = client.comments().analyze(body=analyze_request_not_en).execute()
|
||||||
try: return [float(response['attributeScores']['TOXICITY']['summaryScore']['value']), float(response['attributeScores']['SEVERE_TOXICITY']['summaryScore']['value']), float(response['attributeScores']['IDENTITY_ATTACK']['summaryScore']['value']), float(response['attributeScores']['INSULT']['summaryScore']['value']), float(response['attributeScores']['PROFANITY']['summaryScore']['value']), float(response['attributeScores']['THREAT']['summaryScore']['value']), float(response['attributeScores']['SEXUALLY_EXPLICIT']['summaryScore']['value']), float(response['attributeScores']['FLIRTATION']['summaryScore']['value']), float(response['attributeScores']['OBSCENE']['summaryScore']['value']), float(response['attributeScores']['SPAM']['summaryScore']['value'])]
|
try:
|
||||||
except: return [float(response['attributeScores']['TOXICITY']['summaryScore']['value']), float(response['attributeScores']['SEVERE_TOXICITY']['summaryScore']['value']), float(response['attributeScores']['IDENTITY_ATTACK']['summaryScore']['value']), float(response['attributeScores']['INSULT']['summaryScore']['value']), float(response['attributeScores']['PROFANITY']['summaryScore']['value']), float(response['attributeScores']['THREAT']['summaryScore']['value'])]
|
return [
|
||||||
|
float(response["attributeScores"]["TOXICITY"]["summaryScore"]["value"]),
|
||||||
|
float(
|
||||||
|
response["attributeScores"]["SEVERE_TOXICITY"]["summaryScore"]["value"]
|
||||||
|
),
|
||||||
|
float(
|
||||||
|
response["attributeScores"]["IDENTITY_ATTACK"]["summaryScore"]["value"]
|
||||||
|
),
|
||||||
|
float(response["attributeScores"]["INSULT"]["summaryScore"]["value"]),
|
||||||
|
float(response["attributeScores"]["PROFANITY"]["summaryScore"]["value"]),
|
||||||
|
float(response["attributeScores"]["THREAT"]["summaryScore"]["value"]),
|
||||||
|
float(
|
||||||
|
response["attributeScores"]["SEXUALLY_EXPLICIT"]["summaryScore"][
|
||||||
|
"value"
|
||||||
|
]
|
||||||
|
),
|
||||||
|
float(response["attributeScores"]["FLIRTATION"]["summaryScore"]["value"]),
|
||||||
|
float(response["attributeScores"]["OBSCENE"]["summaryScore"]["value"]),
|
||||||
|
float(response["attributeScores"]["SPAM"]["summaryScore"]["value"]),
|
||||||
|
]
|
||||||
|
except:
|
||||||
|
return [
|
||||||
|
float(response["attributeScores"]["TOXICITY"]["summaryScore"]["value"]),
|
||||||
|
float(
|
||||||
|
response["attributeScores"]["SEVERE_TOXICITY"]["summaryScore"]["value"]
|
||||||
|
),
|
||||||
|
float(
|
||||||
|
response["attributeScores"]["IDENTITY_ATTACK"]["summaryScore"]["value"]
|
||||||
|
),
|
||||||
|
float(response["attributeScores"]["INSULT"]["summaryScore"]["value"]),
|
||||||
|
float(response["attributeScores"]["PROFANITY"]["summaryScore"]["value"]),
|
||||||
|
float(response["attributeScores"]["THREAT"]["summaryScore"]["value"]),
|
||||||
|
]
|
||||||
|
|
||||||
#test part
|
|
||||||
|
# test part
|
||||||
def test():
|
def test():
|
||||||
print("Testing toxicity.py...")
|
print("Testing toxicity.py...")
|
||||||
print("Hello world:")
|
print("Hello world:")
|
||||||
result = get_toxicity('Hello world')
|
result = get_toxicity("Hello world")
|
||||||
try: print(f"TOXICITY: {result[0]}; SEVERE_TOXICITY: {result[1]}; IDENTITY ATTACK: {result[2]}; INSULT: {result[3]}; PROFANITY: {result[4]}; THREAT: {result[5]}; SEXUALLY EXPLICIT: {result[6]}; FLIRTATION: {result[7]}; OBSCENE: {result[8]}; SPAM: {result[9]}")
|
try:
|
||||||
except: print(f"TOXICITY: {result[0]}; SEVERE_TOXICITY: {result[1]}; IDENTITY ATTACK: {result[2]}; INSULT: {result[3]}; PROFANITY: {result[4]}; THREAT: {result[5]}")
|
print(
|
||||||
|
f"TOXICITY: {result[0]}; SEVERE_TOXICITY: {result[1]}; IDENTITY ATTACK: {result[2]}; INSULT: {result[3]}; PROFANITY: {result[4]}; THREAT: {result[5]}; SEXUALLY EXPLICIT: {result[6]}; FLIRTATION: {result[7]}; OBSCENE: {result[8]}; SPAM: {result[9]}"
|
||||||
|
)
|
||||||
|
except:
|
||||||
|
print(
|
||||||
|
f"TOXICITY: {result[0]}; SEVERE_TOXICITY: {result[1]}; IDENTITY ATTACK: {result[2]}; INSULT: {result[3]}; PROFANITY: {result[4]}; THREAT: {result[5]}"
|
||||||
|
)
|
||||||
print("HELLO WORLD GET ABSOLUTELY BUY MY NEW MERCH OMGGGGGGG:")
|
print("HELLO WORLD GET ABSOLUTELY BUY MY NEW MERCH OMGGGGGGG:")
|
||||||
result = get_toxicity('HELLO WORLD GET ABSOLUTELY BUY MY NEW MERCH OMGGGGGGG')
|
result = get_toxicity("HELLO WORLD GET ABSOLUTELY BUY MY NEW MERCH OMGGGGGGG")
|
||||||
try: print(f"TOXICITY: {result[0]}; SEVERE_TOXICITY: {result[1]}; IDENTITY ATTACK: {result[2]}; INSULT: {result[3]}; PROFANITY: {result[4]}; THREAT: {result[5]}; SEXUALLY EXPLICIT: {result[6]}; FLIRTATION: {result[7]}; OBSCENE: {result[8]}; SPAM: {result[9]}")
|
try:
|
||||||
except: print(f"TOXICITY: {result[0]}; SEVERE_TOXICITY: {result[1]}; IDENTITY ATTACK: {result[2]}; INSULT: {result[3]}; PROFANITY: {result[4]}; THREAT: {result[5]}")
|
print(
|
||||||
#uncomment the following line to test the code
|
f"TOXICITY: {result[0]}; SEVERE_TOXICITY: {result[1]}; IDENTITY ATTACK: {result[2]}; INSULT: {result[3]}; PROFANITY: {result[4]}; THREAT: {result[5]}; SEXUALLY EXPLICIT: {result[6]}; FLIRTATION: {result[7]}; OBSCENE: {result[8]}; SPAM: {result[9]}"
|
||||||
#test()
|
)
|
||||||
|
except:
|
||||||
|
print(
|
||||||
|
f"TOXICITY: {result[0]}; SEVERE_TOXICITY: {result[1]}; IDENTITY ATTACK: {result[2]}; INSULT: {result[3]}; PROFANITY: {result[4]}; THREAT: {result[5]}"
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
# uncomment the following line to test the code
|
||||||
|
# test()
|
||||||
|
|||||||
@@ -2,12 +2,14 @@ import io
|
|||||||
import os
|
import os
|
||||||
import asyncio
|
import asyncio
|
||||||
from config import debug
|
from config import debug
|
||||||
|
|
||||||
# Imports the Google Cloud client library
|
# Imports the Google Cloud client library
|
||||||
from google.cloud import vision
|
from google.cloud import vision
|
||||||
|
|
||||||
# Instantiates a client
|
# Instantiates a client
|
||||||
client = vision.ImageAnnotatorClient()
|
client = vision.ImageAnnotatorClient()
|
||||||
|
|
||||||
|
|
||||||
async def process(attachment):
|
async def process(attachment):
|
||||||
debug("Processing image...")
|
debug("Processing image...")
|
||||||
image = vision.Image()
|
image = vision.Image()
|
||||||
@@ -18,18 +20,25 @@ async def process(attachment):
|
|||||||
labels = labels.label_annotations
|
labels = labels.label_annotations
|
||||||
texts = texts.text_annotations
|
texts = texts.text_annotations
|
||||||
objects = objects.localized_object_annotations
|
objects = objects.localized_object_annotations
|
||||||
#we take the first 4 labels and the first 4 objects
|
# we take the first 4 labels and the first 4 objects
|
||||||
labels = labels[:2]
|
labels = labels[:2]
|
||||||
objects = objects[:7]
|
objects = objects[:7]
|
||||||
final = "<image\n"
|
final = "<image\n"
|
||||||
if len(labels) > 0: final += "Labels:\n"
|
if len(labels) > 0:
|
||||||
|
final += "Labels:\n"
|
||||||
for label in labels:
|
for label in labels:
|
||||||
final += label.description + ", "
|
final += label.description + ", "
|
||||||
final = final[:-2] + "\n"
|
final = final[:-2] + "\n"
|
||||||
if len(texts) > 0: final += "Text:\n"
|
if len(texts) > 0:
|
||||||
try: final += texts[0].description + "\n" #we take the first text, wich is the whole text in reality
|
final += "Text:\n"
|
||||||
except: pass
|
try:
|
||||||
if len(objects) > 0: final += "Objects:\n"
|
final += (
|
||||||
|
texts[0].description + "\n"
|
||||||
|
) # we take the first text, wich is the whole text in reality
|
||||||
|
except:
|
||||||
|
pass
|
||||||
|
if len(objects) > 0:
|
||||||
|
final += "Objects:\n"
|
||||||
for obj in objects:
|
for obj in objects:
|
||||||
final += obj.name + ", "
|
final += obj.name + ", "
|
||||||
final = final[:-2] + "\n"
|
final = final[:-2] + "\n"
|
||||||
@@ -39,8 +48,12 @@ async def process(attachment):
|
|||||||
if not os.path.exists("./../database/google-vision/results"):
|
if not os.path.exists("./../database/google-vision/results"):
|
||||||
os.mkdir("./../database/google-vision/results")
|
os.mkdir("./../database/google-vision/results")
|
||||||
# we create the file
|
# we create the file
|
||||||
with open(f"./../database/google-vision/results/{attachment.id}.txt", "w", encoding="utf-8") as f:
|
with open(
|
||||||
|
f"./../database/google-vision/results/{attachment.id}.txt",
|
||||||
|
"w",
|
||||||
|
encoding="utf-8",
|
||||||
|
) as f:
|
||||||
f.write(final)
|
f.write(final)
|
||||||
f.close()
|
f.close()
|
||||||
|
|
||||||
return final
|
return final
|
||||||
|
|||||||
Reference in New Issue
Block a user