2023-03-13 21:39:51 -04:00
import sqlite3
2023-03-15 11:45:11 -04:00
from sqlite3 import Error
2023-08-01 17:52:14 -04:00
import discord
from redbot . core import Config , checks , commands , data_manager
from tabulate import tabulate
2023-03-05 22:53:54 -05:00
2023-03-05 22:55:04 -05:00
class SugonCredit ( commands . Cog ) :
2023-03-05 22:53:54 -05:00
""" Implements a way for moderators to give out social-credit like points, dubbed ' sugoncredits ' by the community. """
2023-08-01 17:37:25 -04:00
2023-03-05 22:53:54 -05:00
def __init__ ( self , bot ) :
self . bot = bot
2023-03-13 21:39:51 -04:00
self . config = Config . get_conf ( self , identifier = 47252584 )
2023-03-14 20:05:21 -04:00
self . config . register_guild (
2023-03-13 21:39:51 -04:00
bank_name = " Social Credit Enforcement Agency " ,
currency_name = " Social Credit " ,
2023-03-14 19:49:55 -04:00
max_bal = 1000000000 ,
min_bal = - 1000000000
2023-03-13 21:39:51 -04:00
)
2023-03-16 16:30:22 -04:00
self . data_path = data_manager . cog_data_path ( self ) / " credit.db "
con = sqlite3 . connect ( f ' { self . data_path } ' )
2023-03-15 11:45:11 -04:00
con . commit ( )
con . close ( )
2023-03-14 22:45:13 -04:00
2023-08-01 17:52:14 -04:00
def pluralize ( word , count ) :
2023-08-01 17:58:31 -04:00
if count == 1 :
return word
elif word . endswith ( ' s ' ) or word . endswith ( ' x ' ) or word . endswith ( ' z ' ) or word . endswith ( ' ch ' ) or word . endswith ( ' sh ' ) :
return word + ' es '
elif word . endswith ( ' y ' ) :
# Change 'y' to 'ies' for words ending with a consonant + 'y'
return word [ : - 1 ] + ' ies '
else :
return word + ' s '
2023-08-01 17:52:14 -04:00
2023-03-16 16:30:22 -04:00
def new_guild_generation ( self , guild_id ) :
2023-08-01 18:03:45 -04:00
""" Adds a new table for a guild to the SQLite database. """
con = sqlite3 . connect ( self . data_path )
2023-03-13 21:39:51 -04:00
cur = con . cursor ( )
2023-08-01 18:03:45 -04:00
try :
2023-08-01 18:05:49 -04:00
cur . execute ( f " SELECT 1 FROM ' { guild_id } ' LIMIT 1; " )
2023-08-01 18:03:45 -04:00
except sqlite3 . OperationalError :
2023-08-01 18:05:49 -04:00
cur . execute ( f " CREATE TABLE ' { guild_id } ' (user_id TEXT, balance REAL); " )
2023-03-13 21:39:51 -04:00
con . commit ( )
2023-03-14 22:45:13 -04:00
con . close ( )
2023-08-01 17:37:25 -04:00
2023-03-16 16:30:22 -04:00
def new_user_generation ( self , guild_id , target ) :
2023-03-13 21:39:51 -04:00
""" Adds a new user to the SQLite database. """
2023-03-16 16:30:22 -04:00
con = sqlite3 . connect ( f ' { self . data_path } ' )
2023-03-13 21:39:51 -04:00
cur = con . cursor ( )
2023-03-16 16:30:22 -04:00
cur . execute ( f ''' INSERT INTO { guild_id }
2023-08-01 17:37:25 -04:00
VALUES ( { target . id } , 250 ) ; ''' )
2023-03-13 21:39:51 -04:00
con . commit ( )
con . close ( )
2023-08-01 17:37:25 -04:00
2023-03-05 22:53:54 -05:00
@commands.group ( autohelp = True , aliases = [ " sugoncredit " ] )
@commands.guild_only ( )
2023-03-05 22:56:00 -05:00
async def credit ( self , ctx ) :
2023-03-05 22:53:54 -05:00
""" Simple points system. """
2023-03-14 22:45:13 -04:00
@credit.command ( )
@commands.guild_only ( )
2023-03-15 11:45:11 -04:00
async def leaderboard ( self , ctx , page : int = 1 ) :
2023-03-14 22:45:13 -04:00
""" Shows the individuals with the highest balances. """
await ctx . send ( content = " This command isn ' t done yet! " )
2023-03-16 16:30:22 -04:00
con = sqlite3 . connect ( f ' { self . data_path } ' )
2023-03-15 11:45:11 -04:00
cur = con . cursor ( )
2023-03-16 16:30:22 -04:00
await self . new_guild_generation ( self , ctx . guild . id )
2023-03-15 11:45:11 -04:00
bank_name = await self . config . guild ( ctx . guild ) . bank_name ( )
currency_name = await self . config . guild ( ctx . guild ) . currency_name ( )
offset = ( page - 1 ) * 10
raw_list = cur . execute ( f ''' SELECT user_id, balance FROM { ctx . guild . id }
ORDER BY balance DESC
LIMIT 10 OFFSET { offset } ; ''' )
await ctx . send ( content = f " { raw_list } " )
2023-03-14 22:45:13 -04:00
2023-03-05 22:53:54 -05:00
@credit.command ( )
@commands.guild_only ( )
async def balance ( self , ctx , user : discord . Member = None ) :
""" Checks an account ' s balance. """
2023-08-01 17:52:14 -04:00
target = user if user else ctx . author
con = sqlite3 . connect ( self . data_path )
2023-03-13 21:39:51 -04:00
cur = con . cursor ( )
2023-08-01 18:09:07 -04:00
await self . new_guild_generation ( ctx . guild . id )
2023-08-01 17:52:14 -04:00
bank_name = await self . config . guild ( ctx . guild ) . get_raw ( ' bank_name ' , default = " Bank " )
currency_name = await self . config . guild ( ctx . guild ) . get_raw ( ' currency_name ' , default = " Credit " )
cur . execute ( f " SELECT user_id FROM { ctx . guild . id } WHERE user_id = ?; " , ( target . id , ) )
if not cur . fetchone ( ) :
2023-08-01 18:09:07 -04:00
await self . new_user_generation ( ctx . guild . id , target )
2023-08-01 17:52:14 -04:00
cur . execute ( f " SELECT balance FROM { ctx . guild . id } WHERE user_id = ?; " , ( target . id , ) )
bal = cur . fetchone ( ) [ 0 ]
output_bal = f ' { bal : , } '
pluralized_currency_name = await self . pluralize ( currency_name , bal )
embed_title = f " { bank_name } - Balance "
embed_color = await self . bot . get_embed_color ( None )
embed_description = f " { target . mention } has { output_bal } { pluralized_currency_name } . "
embed = discord . Embed ( title = embed_title , color = embed_color , description = embed_description )
2023-03-05 22:53:54 -05:00
await ctx . send ( embed = embed )
2023-03-16 16:30:22 -04:00
con . close ( )
2023-03-05 22:53:54 -05:00
@credit.command ( )
@commands.guild_only ( )
@commands.mod ( )
async def add ( self , ctx , target : discord . Member , amount : int ) :
""" Adds credits to an account. """
2023-03-05 23:24:13 -05:00
try :
val = int ( amount )
except ValueError :
await ctx . send ( content = " ``amount`` must be a number! Please try again. " )
return
2023-03-16 16:30:22 -04:00
con = sqlite3 . connect ( f ' { self . data_path } ' )
2023-03-14 19:42:44 -04:00
cur = con . cursor ( )
2023-03-16 16:30:22 -04:00
await self . new_guild_generation ( { ctx . guild . id } )
2023-03-06 23:03:37 -05:00
image = discord . File ( fp = data_manager . bundled_data_path ( self ) / " add.png " , filename = " Add.png " )
2023-03-13 21:39:51 -04:00
bank_name = await self . config . bank_name ( )
currency_name = await self . config . currency_name ( )
max_bal = await self . config . max_bal ( )
2023-03-14 19:49:55 -04:00
min_bal = await self . config_min_bal ( )
2023-03-14 22:45:13 -04:00
current_bal = cur . execute ( f ''' SELECT balance FROM { ctx . guild . id }
2023-03-14 19:42:44 -04:00
WHERE user_id = { target . id } ; ''' )
2023-03-05 22:53:54 -05:00
new_bal = current_bal + amount
2023-03-06 22:09:59 -05:00
output_amount = ( f ' { val : , } ' )
output_new_bal = ( f ' { new_bal : , } ' )
output_max_bal = ( f ' { max_bal : , } ' )
2023-03-14 19:49:55 -04:00
output_min_bal = ( f ' { min_bal : , } ' )
2023-03-05 22:53:54 -05:00
if new_bal > max_bal :
2023-03-06 22:09:59 -05:00
await ctx . send ( content = f " You are attempting to set { target . mention } ' s balance to above { output_max_bal } . Please try again! " )
2023-03-05 22:53:54 -05:00
return
2023-03-14 19:49:55 -04:00
elif new_bal < min_bal :
await ctx . send ( content = f " You are attempting to set { target . mention } ' s balance to below { output_min_bal } . Please try again! " )
2023-03-06 21:21:14 -05:00
elif ctx . guild . id == 204965774618656769 :
2023-03-06 21:56:38 -05:00
logging_channel = self . bot . get_channel ( 1082495815878189076 )
2023-03-14 22:45:13 -04:00
cur . execute ( f ''' UPDATE { ctx . guild . id }
2023-03-14 19:42:44 -04:00
SET balance = { new_bal }
WHERE user_id = { target . id } ; ''' )
2023-03-06 22:09:59 -05:00
await ctx . send ( content = f " { target . mention } now has { output_amount } more SugonCredit, with a total of { output_new_bal } ! " )
2023-03-06 21:21:14 -05:00
if amount == 1 or amount == - 1 :
2023-03-06 23:02:51 -05:00
await target . send ( content = f " You gained { output_amount } SugonCredit! Good work community member! You now have { output_new_bal } SugonCredits. " , file = image )
2023-03-06 21:21:14 -05:00
else :
2023-03-06 23:02:51 -05:00
await target . send ( content = f " You gained { output_amount } SugonCredits! Good work community member! You now have { output_new_bal } SugonCredits. " , file = image )
2023-03-06 21:56:38 -05:00
logging_embed = discord . Embed ( title = " SugonCredit Added " , color = await self . bot . get_embed_color ( None ) , description = f " { ctx . author . name } # { ctx . author . discriminator } ( { ctx . author . id } ) added { amount } SugonCredit to { target . name } # { target . discriminator } ( { target . id } )! They now have { new_bal } SugonCredit. " )
await logging_channel . send ( embed = logging_embed )
2023-03-06 21:27:42 -05:00
elif ctx . guild . id != 204965774618656769 :
2023-03-06 22:09:59 -05:00
embed = discord . Embed ( title = f " { bank_name } - Add " , color = await self . bot . get_embed_color ( None ) , description = f " { target . mention } ' s { currency_name } balance has been increased by { output_amount } . \n Current balance is { output_new_bal } . " )
2023-03-14 22:45:13 -04:00
cur . execute ( f ''' UPDATE { ctx . guild . id }
2023-03-14 19:42:44 -04:00
SET balance = { new_bal }
WHERE user_id = { target . id } ; ''' )
2023-03-05 22:53:54 -05:00
await ctx . send ( embed = embed )
2023-03-14 19:42:44 -04:00
con . commit ( )
con . close ( )
2023-03-05 22:53:54 -05:00
@credit.command ( )
@commands.guild_only ( )
@commands.mod ( )
async def remove ( self , ctx , target : discord . Member , amount : int ) :
""" Removes credits from an account. """
2023-03-05 23:24:13 -05:00
try :
val = int ( amount )
except ValueError :
await ctx . send ( content = " ``amount`` must be a number. Please try again! " )
return
2023-03-06 23:03:37 -05:00
image = discord . File ( fp = data_manager . bundled_data_path ( self ) / " remove.mp4 " , filename = " MEGA_BASE.mp4 " )
2023-03-15 11:59:46 -04:00
data_path = data_manager . cog_data_path ( self ) / " credit.db "
con = sqlite3 . connect ( f ' { data_path } ' )
2023-03-14 19:42:44 -04:00
cur = con . cursor ( )
2023-03-16 16:30:22 -04:00
await self . new_guild_generation ( { ctx . guild . id } )
2023-03-13 21:39:51 -04:00
bank_name = await self . config . bank_name ( )
currency_name = await self . config . currency_name ( )
max_bal = await self . config . max_bal ( )
2023-03-14 19:49:55 -04:00
min_bal = await self . config_min_bal ( )
2023-03-14 22:45:13 -04:00
current_bal = cur . execute ( f ''' SELECT balance FROM { ctx . guild . id }
2023-03-14 19:42:44 -04:00
WHERE user_id = { target . id } ; ''' )
2023-03-05 22:53:54 -05:00
new_bal = current_bal - amount
2023-03-06 22:09:59 -05:00
output_amount = ( f ' { val : , } ' )
output_new_bal = ( f ' { new_bal : , } ' )
2023-03-13 21:39:51 -04:00
output_max_bal = ( f ' { max_bal : , } ' )
2023-03-14 19:49:55 -04:00
output_min_bal = ( f ' { min_bal : , } ' )
2023-03-14 19:45:50 -04:00
if new_bal > max_bal :
2023-03-13 21:39:51 -04:00
await ctx . send ( content = f " You are attempting to set { target . mention } ' s balance to above { output_max_bal } . Please try again! " )
2023-03-14 19:49:55 -04:00
elif new_bal < min_bal :
await ctx . send ( content = f " You are attempting to set { target . mention } ' s balance to below { output_min_bal } . Please try again! " )
2023-03-06 21:21:14 -05:00
elif ctx . guild . id == 204965774618656769 :
2023-03-14 22:45:13 -04:00
cur . execute ( f ''' UPDATE { ctx . guild . id }
2023-03-14 19:42:44 -04:00
SET balance = { new_bal }
WHERE user_id = { target . id } ; ''' )
2023-03-06 21:56:38 -05:00
logging_channel = self . bot . get_channel ( 1082495815878189076 )
2023-03-06 22:09:59 -05:00
await ctx . send ( content = f " { target . mention } now has { output_amount } less SugonCredit, with a total of { output_new_bal } ! \n If this is a punishment, do better Galaxy Player! Re-education mods will be sent to your DM ' s if your SugonCredit drops to a substantially low amount! " )
2023-03-06 21:21:14 -05:00
if amount == 1 or amount == - 1 :
2023-03-06 23:02:01 -05:00
await target . send ( content = f " __MESSAGE FROM THE MINISTRY OF THE MEGA BASE__ \n \n (我们的) { output_amount } SugonCredit has been taken from your account. Citizen, do not continue to preform bad actions! Glory to the Galaxy Communist Party! " , file = image )
2023-03-06 21:21:14 -05:00
else :
2023-03-06 23:02:01 -05:00
await target . send ( content = f " __MESSAGE FROM THE MINISTRY OF THE MEGA BASE__ \n \n (我们的) { output_amount } SugonCredits have been taken from your account. Citizen, do not continue to preform bad actions! Glory to the Galaxy Communist Party! " , file = image )
2023-03-06 22:09:59 -05:00
logging_embed = discord . Embed ( title = " SugonCredit Removed " , color = await self . bot . get_embed_color ( None ) , description = f " { ctx . author . name } # { ctx . author . discriminator } ( { ctx . author . id } ) removed { output_amount } SugonCredit from { target . name } # { target . discriminator } ( { target . id } )! They now have { output_new_bal } SugonCredit. " )
2023-03-06 21:58:50 -05:00
await logging_channel . send ( embed = logging_embed )
2023-03-06 21:25:52 -05:00
elif ctx . guild . id != 204965774618656769 :
2023-03-06 22:09:59 -05:00
embed = discord . Embed ( title = f " { bank_name } - Remove " , color = await self . bot . get_embed_color ( None ) , description = f " { target . mention } ' s { currency_name } balance has been decreased by { output_amount } . \n Current balance is { output_new_bal } . " )
2023-03-06 21:25:52 -05:00
await ctx . send ( embed = embed )
2023-03-14 22:45:13 -04:00
cur . execute ( f ''' UPDATE { ctx . guild . id }
2023-03-14 19:42:44 -04:00
SET balance = { new_bal }
WHERE user_id = { target . id } ; ''' )
con . commit ( )
2023-08-01 17:37:25 -04:00
con . close ( )