class CommonRepository: # initialize RaffleRepository def __init__(self): self.db = Database() def add_currency_to_table(self, table, idcolumn, id, amount): currency = self.db.select(['Currency'], table, f"{idcolumn} = %s", [id]).getRows()[0]['Currency'] newTotal = int(currency) + int(amount) self.db.update(table, ['Currency'], { 'Currency': newTotal }, f"{idcolumn} = %s", [id]) # adds amount to specified users's currency def add_currency_to_raffle(self, raffleid, amount): self.add_currency_to_table('raffles', 'RaffleID', raffleid, amount) # adds amount to specified users's currency def add_to_user_currency(self, discorduserid, amount): self.add_currency_to_table('discordusers', 'DiscordUserID', discorduserid, amount) # subtracts amount from specified users's currency def subtract_from_user_currency(self, discorduserid, amount): self.add_to_user_currency(discorduserid, -1 * amount)
class DTORepository: # initialize DTORepository def __init__(self): self.db = Database() def __getKeys(self, entity): props = [] for key in entity.keys(): props.append(key) return props # returns the table passed def selectAll(self, table): dt = self.db.select(['*'], table) print('asdf') print(str(dt)) print('asdf') return eval(str(dt)) # retrieve information for the get id method on the controller def insert(self, table, entity): props = self.__getKeys(entity) return self.db.insertOne(table, props, entity) def select(self, table, IDColumn, ID): dt = self.db.select(['*'], table, f"{IDColumn} = %s", [ID]) print(str(dt)) return eval(str(dt)) def update(self, table, entity, where = '', values = []): props = self.__getKeys(entity) return self.db.update(table, props, entity, where, values) def delete(self, table, where = '', values = []): dt = self.db.delete(table, where, values) return eval(str(dt))
class CurrencyRepository: # initialize CurrencyRepository def __init__(self): self.db = Database() def insertTransaction(self, fromID, toID, time, amount): self.db.insertOne( 'currencytransactions', ['FromDiscordUserID', 'ToDiscordUserID', 'Date', 'Amount'], { 'FromDiscordUserID': fromID, 'ToDiscordUserID': toID, 'Date': time, 'Amount': amount }) def daily(self, discordUserID, amount): try: dt = self.db.select(['*'], 'discordusers', 'DiscordUserID = %s', [discordUserID]) user = dt.getRows()[0] if len(dt.getRows()) == 1 else None if user != None: now = datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S") timeUntilNextDaily = 0 if user['LastDaily'] == None: timeUntilNextDaily = 60 * 60 * 24 else: nowtime = datetime.datetime.now().timestamp() thentime = datetime.datetime.fromisoformat( str(user['LastDaily'])).timestamp() timeUntilNextDaily = int(thentime + (60 * 60 * 24) - nowtime) if timeUntilNextDaily < 0: userJSON = eval(str(user)) userJSON['LastDaily'] = now userJSON['Currency'] = int(userJSON['Currency']) + amount self.insertTransaction(0, discordUserID, now, amount) self.db.update('discordusers', ['Currency', 'LastDaily'], userJSON, 'DiscordUserID = %s', [discordUserID]) return True else: return timeUntilNextDaily * 1000 else: return False except: return False def transfer(self, senderID, receiverID, amount): try: if amount > 0: dt1 = self.db.select(['*'], 'discordusers', 'DiscordUserID = %s', [senderID]) dt2 = self.db.select(['*'], 'discordusers', 'DiscordUserID = %s', [receiverID]) sendingUser = dt1.getRows()[0] if len( dt1.getRows()) == 1 else None receivingUser = dt2.getRows()[0] if len( dt2.getRows()) == 1 else None if sendingUser != None and receivingUser != None: now = datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S") sendingUserJSON = eval(str(sendingUser)) receivingUserJSON = eval(str(receivingUser)) sendingUserJSON['Currency'] = int( sendingUserJSON['Currency']) - amount receivingUserJSON['Currency'] = int( receivingUserJSON['Currency']) + amount self.insertTransaction(senderID, receiverID, now, amount) self.db.update('discordusers', ['Currency'], sendingUserJSON, 'DiscordUserID = %s', [senderID]) self.db.update('discordusers', ['Currency'], receivingUserJSON, 'DiscordUserID = %s', [receiverID]) return True else: return False else: return 'You cannot transfer a negative amount.' except: return False
class SocialMediaRepository: # initialize SocialMediaRepository def __init__(self): self.db = Database() self._commonRepository = CommonRepository() # Lists the different social media platforms that this bot supports def list_all(self): try: # SELECT Title AS Platform, URL AS Link, Link AS Icon # FROM socialmedias # JOIN resources ON socialmedias.ResourceID = resources.ResourceID; socialmedias = self.db.select(['Title AS Platform', 'URL AS Link', 'Link AS Icon'], \ 'socialmedias JOIN resources ON socialmedias.ResourceID = resources.ResourceID') return eval(str(socialmedias)), StatusCodes.OK except: # some error has occurred return '', StatusCodes.INTERNAL_SERVER_ERROR # Adds the specified <socialmedia> platform and <handle> to the sending user's profile def add_social_media(self, rDiscordUserID, rPlatform, rLink): try: # SELECT * FROM socialmedias WHERE Title = 'Facebook'; socialMedia = self.db.select(['SocialMediaID'], 'socialmedias', 'Title = %s', [rPlatform]).getRows() if len(socialMedia) > 0: smID = socialMedia[0]['SocialMediaID'] # INSERT INTO discordusersocialmedias (DiscordUserID, SocialMediaID, Handle) # VALUES ('309176098590294026', '1', 'Nathan Gawith'); if len( self.db.select( ['*'], 'discordusersocialmedias', 'DiscordUserID = %s AND SocialMediaID = %s', [rDiscordUserID, smID]).getRows()) > 0: self.db.update( 'discordusersocialmedias', ['Handle'], {'Handle': rLink}, 'DiscordUserID = %s AND SocialMediaID = %s', [rDiscordUserID, smID]) else: self.db.insertOne( 'discordusersocialmedias', ['DiscordUserID', 'SocialMediaID', 'Handle'], { 'DiscordUserID': rDiscordUserID, 'SocialMediaID': smID, 'Handle': rLink }) return '', StatusCodes.OK else: return f"'{rPlatform}' was not found in the socialmedias table", StatusCodes.NOT_FOUND except: # some error has occurred return '', StatusCodes.INTERNAL_SERVER_ERROR # returns information about the specific social media for the specified user def get_social_media(self, rDiscordUserID, rSocialMediaName): try: # SELECT * FROM socialmedias WHERE Title = 'Facebook'; socialMedia = self.db.select(['SocialMediaID'], 'socialmedias', 'Title LIKE %s', [rSocialMediaName]).getRows() if len(socialMedia) > 0: # SELECT Title AS Platform, Handle AS Link, Link AS ICON # FROM discordusersocialmedias # INNER JOIN socialmedias ON discordusersocialmedias.SocialMediaID = socialmedias.SocialMediaID # INNER JOIN resources ON socialmedias.ResourceID = resources.ResourceID # WHERE DiscordUserID = '123456789123456789' AND Title LIKE 'Facebook'; qeryResult = self.db.select(['Title AS Platform', 'Handle AS Link', 'Link AS ICON'], \ '''discordusersocialmedias INNER JOIN socialmedias ON discordusersocialmedias.SocialMediaID = socialmedias.SocialMediaID INNER JOIN resources ON socialmedias.ResourceID = resources.ResourceID''', 'DiscordUserID = %s AND Title LIKE %s', [rDiscordUserID, rSocialMediaName]) return eval(str(qeryResult)), StatusCodes.OK else: return f"'{rSocialMediaName}' was not found in the socialmedias table", StatusCodes.NOT_FOUND except: # some error has occurred return '', StatusCodes.INTERNAL_SERVER_ERROR # Adds the specified <socialmedia> platform and <handle> to the sending user's profile def get_social_medias(self, rDiscordUserID): try: return self.get_social_media(rDiscordUserID, '%') except: # some error has occurred return '', StatusCodes.INTERNAL_SERVER_ERROR # deletes from discordusersocialmedias for the specific social media and discorduser def delete_social_media(self, rDiscordUserID, rSocialMediaName): try: # SELECT * FROM socialmedias WHERE Title = 'Facebook'; socialMedia = self.db.select(['SocialMediaID'], 'socialmedias', 'Title LIKE %s', [rSocialMediaName]).getRows() if len(socialMedia) > 0: # SELECT Title AS Platform, Handle AS Link, Link AS ICON # FROM discordusersocialmedias # INNER JOIN socialmedias ON discordusersocialmedias.SocialMediaID = socialmedias.SocialMediaID # INNER JOIN resources ON socialmedias.ResourceID = resources.ResourceID # WHERE DiscordUserID = '123456789123456789' AND Title LIKE 'Facebook'; if len(self.db.select(['Title AS Platform', 'Handle AS Link', 'Link AS ICON'], \ '''discordusersocialmedias INNER JOIN socialmedias ON discordusersocialmedias.SocialMediaID = socialmedias.SocialMediaID INNER JOIN resources ON socialmedias.ResourceID = resources.ResourceID''', 'DiscordUserID = %s AND Title LIKE %s', [rDiscordUserID, rSocialMediaName]).getRows()) > 0: self.db.delete( 'discordusersocialmedias', 'DiscordUserID = %s AND SocialMediaID = %s', [rDiscordUserID, str(socialMedia[0]['SocialMediaID'])]) return 'Success', StatusCodes.OK else: return 'This user does not have this specific social media', StatusCodes.NOT_FOUND else: return f"'{rSocialMediaName}' was not found in the socialmedias table", StatusCodes.NOT_FOUND except: # some error has occurred return '', StatusCodes.INTERNAL_SERVER_ERROR
class AddBatchRepository: # initialize AddBatchRepository def __init__(self): self.db = Database() # add batch of servers to the database def add_batch_servers(self, servers: list): try: dtoRepository = DTORepository() currentServers = dtoRepository.selectAll('servers') dbserverids = [s['ServerID'] for s in currentServers] for server in servers: print(server['ServerID']) if server['ServerID'] in dbserverids: dtoRepository.update('servers', server, 'ServerID = %s', [server['ServerID']]) else: dtoRepository.insert('servers', server) return True except Exception as e: print(e) return False # add batch of users to the database def add_batch_users(self, users: list): try: # get list of serverids from the atabase dtoRepository = DTORepository() currentServers = dtoRepository.selectAll('servers') dbserverids = [s['ServerID'] for s in currentServers] currentDiscordUsers = dtoRepository.selectAll('discordusers') dbdiscorduserids = [ d['DiscordUserID'] for d in currentDiscordUsers ] for user in users: for server in user['Servers']: if not server['ServerID'] in dbserverids: # add each discorduserserver relationship to the DB server['DiscordUserID'] = user['DiscordUserID'] self.db.insertOne( 'discorduserservers', ['DiscordUserID', 'ServerID', 'JoinDate'], eval(server)) # add user if all of the ServerIDs for that user have allready been added to the DB del user['Servers'] # if the user is new, insert if not user['DiscordUserID'] in dbdiscorduserids: # insert profile picture self.db.insertOne('resources', ['Link'], {'Link': user['ProfilePicture']}) id = self.db.select(['MAX(ResourceID) AS id'], 'resources').getRows()[0]['id'] del user['ProfilePicture'] user['ResourceID'] = id # add the user to the list of users to add user['DiscordUserID'] = user['DiscordUserID'] self.db.insertOne('discordusers', [ 'DiscordUserID', 'UserName', 'UserHash', 'Currency', 'LastDaily', 'RaffleID' ], user) # insert into discordusersocialmedias self.db.insertOne( 'discordusersocialmedias', ['DiscordUserID', 'SocialMediaID', 'Handle'], { 'DiscordUserID': user['DiscordUserID'], 'SocialMediaID': '8', 'Handle': f"{user['UserName']}#{user['UserHash']}" }) # if the user already exists in the db, update else: oldUser = self.db.select( ['DiscordUserID', 'ResourceID'], 'discordusers', 'DiscordUserID = %s', [user['DiscordUserID']]).getRows()[0] oldProfilePictureLink = self.db.select( ['Link'], 'resources', 'ResourceID = \'' + str(oldUser['ResourceID']) + '\'').getRows()[0]['Link'] id = str(oldUser['ResourceID']) # if the profilepicture is new, update resources table if not oldProfilePictureLink == user['ProfilePicture']: dtoRepository.update( 'resources', {'Link': user['ProfilePicture']}, 'ResourceID = \'' + str(oldUser['ResourceID']) + '\'') del user['ProfilePicture'] user['ResourceID'] = id # update discorduser dtoRepository.update( 'discordusers', user, 'DiscordUserID = \'' + oldUser['DiscordUserID'] + '\'') # insert or update discordusersocialmedias if len( self.db.select( ['*'], 'discordusersocialmedias', 'DiscordUserID = %s AND SocialMediaID = 8', [user['DiscordUserID']]).getRows()) > 0: self.db.update( 'discordusersocialmedias', ['DiscordUserID', 'SocialMediaID', 'Handle'], { 'DiscordUserID': user['DiscordUserID'], 'SocialMediaID': '8', 'Handle': f"{user['UserName']}#{user['UserHash']}" }, 'DiscordUserID = %s', [user['DiscordUserID']]) else: self.db.insertOne( 'discordusersocialmedias', ['DiscordUserID', 'SocialMediaID', 'Handle'], { 'DiscordUserID': user['DiscordUserID'], 'SocialMediaID': '8', 'Handle': f"{user['UserName']}#{user['UserHash']}" }) return True except Exception as e: print(e) return False