Exemple #1
0
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)
Exemple #2
0
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
Exemple #4
0
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