Esempio n. 1
0
File: test_db.py Progetto: dgw/sopel
def test_delete_nick_value(db: SopelDB):
    nick = 'TerryGilliam'
    db.set_nick_value(nick, 'testkey', 'test-value')

    # sanity check
    assert db.get_nick_value(nick, 'testkey') == 'test-value', (
        'Check set_nick_value: this key must contain the correct value.')

    # delete key
    db.delete_nick_value(nick, 'testkey')
    assert db.get_nick_value(nick, 'testkey') is None
Esempio n. 2
0
def fmtop(bot, trigger):
    user = trigger.group(2)
    api = bot.config.lastfm.api

    if not user:
        db = SopelDB(bot.config)
        user = db.get_nick_value(trigger.nick, 'lastfm_user')
        if not user:
            bot.say('User not given or set. Use .fmset to set your user')
            return

    r = requests.get('http://ws.audioscrobbler.com/2.0/'
                     '?method=user.gettopartists&user={}&'
                     'api_key={}&format=json'
                     '&period=7day&limit=3'.format(user, api))

    if 'topartists' not in r.json():
        bot.say('User {} not found'.format(user))
        return

    if len(r.json()['topartists']['artist']) == 0:
        bot.say('{} hasn\'t listened to any tracks yet'.format(user))
        return

    artists = ' * '.join(['{} ({})'.format(i['name'], i['playcount'])
                          for i in r.json()['topartists']['artist']])

    out = '{}\'s top artists (7 days): {}'.format(user, artists)

    bot.say(out)
Esempio n. 3
0
def handle_quiz(bot, trigger):
    if not bot.memory['quiz']:
        return

    quiz = bot.memory['quiz']
    if quiz.question.attempt(trigger.args[1]) and not quiz.question.answered:
        quiz.question.answered = True
        bot.say(color('Correct! The answer was {}'.format(quiz.question.answer),
                      colors.GREEN))
        quiz.award_user(trigger.nick, quiz.question.value
                        if bot.config.quiz.win_method == 'score' else 1)
        score = bot.memory['quiz'].get_scores()[trigger.nick]
        bot.say('{} has {} point{}!'.format(trigger.nick, score,
                                            's' * (score > 1)))

        if bot.config.quiz.win_method == 'points':
            win_value = bot.config.quiz.points_to_win
        else:
            win_value = bot.config.quiz.score_to_win
        if score >= win_value:
            bot.say('{} is the winner!'.format(trigger.nick))
            qscores(bot)

            db = SopelDB(bot.config)
            db_users = bot.config.quiz.db_users
            if not db_users or quiz.starter in db_users:
                wins = (db.get_nick_value(trigger.nick, 'quiz_wins') or 0) + 1
                db.set_nick_value(trigger.nick, 'quiz_wins', wins)
                bot.say('{} has won {} time{}'.format(trigger.nick, wins,
                                                      's' * (wins > 1)))

            bot.memory['quiz'] = None
            return

        next_q(bot)
Esempio n. 4
0
def traktstats(bot, trigger):
    user = trigger.group(2)

    if not user:
        db = SopelDB(bot.config)
        user = db.get_nick_value(trigger.nick, 'trakt_user')
        if not user:
            bot.say('User not given or set. Use .traktset to set your user')
            return

    stats_r = requests.get(bot.memory['trakt']['stats_url'].format(user),
                           headers=bot.memory['trakt']['headers'])

    if stats_r.status_code == 404:
        bot.say('User {} does not exist'.format(user))
        return

    ratings_r = requests.get(bot.memory['trakt']['r_url'].format(user),
                             headers=bot.memory['trakt']['headers'])

    stats = stats_r.json()
    ratings = ratings_r.json()
    r_counter = Counter(i['rating'] for i in ratings)
    ratings_dist = '/'.join(str(i) for i in r_counter.values())

    meta = [user,
            stats['movies']['watched'],
            stats['shows']['watched'],
            stats['episodes']['watched'],
            sum(r_counter.values()),
            ratings_dist]
    out = ('{} has watched {} films and {} shows with {} episodes. They have '
           'rated {} films with the following distribution: {}').format(*meta)

    bot.say(out)
Esempio n. 5
0
def fm(bot, trigger):
    user = trigger.group(2)
    api = bot.config.lastfm.api

    if not user:
        db = SopelDB(bot.config)
        user = db.get_nick_value(trigger.nick, 'lastfm_user')
        if not user:
            bot.say('User not given or set. Use .fmset to set your user')
            return

    r = requests.get('http://ws.audioscrobbler.com/2.0/'
                     '?method=user.getrecenttracks&user={}&'
                     'api_key={}&format=json&limit=1'.format(user, api))

    if 'recenttracks' not in r.json():
        bot.say('User {} not found'.format(user))
        return

    if len(r.json()['recenttracks']['track']) == 0:
        bot.say('{} hasn\'t listened to any tracks yet'.format(user))
        return

    last = r.json()['recenttracks']['track'][0]

    if '@attr' in last and last['@attr']['nowplaying'] == 'true':
        action = 'is listening to'
    else:
        action = 'last listened to'

    meta = (user, action, last['artist']['#text'], last['name'],
            last['album']['#text'])
    out = '♫ {} {} {} - {} ({}) ♫'.format(*meta)

    bot.say(out)
Esempio n. 6
0
def twit(bot, trigger):
    user = trigger.group(2)
    if not user:
        db = SopelDB(bot.config)
        user = db.get_nick_value(trigger.nick, 'twit_user')
        if not user:
            bot.say('User not given or set. Use .twitset to set your user')
            return

    url = ('https://api.twitter.com/1.1/statuses/'
           'user_timeline.json?screen_name={}').format(user)

    response, content = bot.memory['twitter']['client'].request(url)
    content_json = json.loads(content.decode('utf-8'))

    if response['status'] == '401':
        bot.say('User {}\'s tweets are private'.format(user))
        return

    if response['status'] == '404':
        bot.say('User {} not found'.format(user))
        return

    last = content_json[0]

    message = ('[Twitter] {last[text]} | {last[user][name]} '
               '(@{last[user][screen_name]}) | {last[retweet_count]} RTs '
               '| {last[favorite_count]} ♥s').format(last=last)

    bot.say(message)
Esempio n. 7
0
File: test_db.py Progetto: dgw/sopel
def test_get_nick_value(db: SopelDB, value):
    nick = 'TerryGilliam'
    nick_id = db.get_nick_id(nick, create=True)

    with db.session() as session:
        nick_value = NickValues(
            nick_id=nick_id,
            key='testkey',
            value=json.dumps(value, ensure_ascii=False),
        )
        session.add(nick_value)
        session.commit()

    assert db.get_nick_value(nick, 'testkey') == value
    assert db.get_nick_value(nick, 'otherkey') is None
    assert db.get_nick_value('NotTestUser', 'testkey') is None, (
        'This key must be defined for TerryGilliam only.')
Esempio n. 8
0
File: test_db.py Progetto: dgw/sopel
def test_delete_nick_value_none(db: SopelDB):
    """Test method doesn't raise an error when there is nothing to delete."""
    nick = 'TerryGilliam'

    # this user doesn't even exist
    db.delete_nick_value(nick, 'testkey')
    assert db.get_nick_value(nick, 'testkey') is None, (
        'Trying to delete a key must not create it.')

    # create a key
    db.set_nick_value(nick, 'otherkey', 'value')

    # delete another key for that user
    db.delete_nick_value(nick, 'testkey')
    assert db.get_nick_value(nick, 'testkey') is None, (
        'Trying to delete a key must not create it.')

    # the nick still exists, and its key as well
    assert db.get_nick_value(
        nick,
        'otherkey') == 'value', ('This key must not be deleted by error.')
Esempio n. 9
0
def strava(bot, trigger):
    db = SopelDB(bot.config)
    strava_token = db.get_nick_value(trigger.nick, 'strava_token')
    if not strava_token:
        bot.say('Strava token not set. Use .stravaset (through PMs) to set')
        return

    client = stravalib.client.Client()
    client.access_token = strava_token

    action = trigger.group(2)
    action_funs = {
        'lastact': strava_lastact,
        'bikes': strava_bikes,
        'koms': strava_koms
    }
    action_fun = action_funs.get(action, strava_help)
    action_fun(bot, trigger, client)
Esempio n. 10
0
def godstats(bot, trigger):
    god = trigger.group(2)

    if not god:
        db = SopelDB(bot.config)
        god = db.get_nick_value(trigger.nick, 'god')
        if not god:
            bot.say('God not given or set. Use .godset to set your god')
            return

    r = requests.get('http://godvillegame.com/gods/api/{}.json'.format(god))
    hero = r.json()

    if 'clan' not in hero:
        hero['clan'] = 'no clan'
        hero['clan_position'] = 'member'

    out = ('{h[godname]}\'s hero {h[name]}: '
           'A level {h[level]} {h[alignment]} {h[gender]}, '
           '{h[clan]} {h[clan_position]}, {h[arena_won]} arena wins, '
           '{h[arena_lost]} arena losses. {h[motto]}.').format(h=hero)

    bot.say(out)
Esempio n. 11
0
File: test_db.py Progetto: dgw/sopel
def test_set_nick_value_update(db: SopelDB):
    """Test set_nick_value can update an existing value."""
    db.set_nick_value('Pepperpots', 'testkey', 'first-value')
    db.set_nick_value('Pepperpots', 'otherkey', 'other-value')
    db.set_nick_value('Vikings', 'testkey', 'other-nick-value')

    # sanity check: ensure every (nick, key, value) is correct
    assert db.get_nick_value('Pepperpots', 'testkey') == 'first-value'
    assert db.get_nick_value('Pepperpots', 'otherkey') == 'other-value'
    assert db.get_nick_value('Vikings', 'testkey') == 'other-nick-value'

    # update only one key
    db.set_nick_value('Pepperpots', 'testkey', 'new-value')

    # check new value while old values are still the same
    assert db.get_nick_value('Pepperpots', 'testkey') == 'new-value'
    assert db.get_nick_value('Pepperpots', 'otherkey') == 'other-value'
    assert db.get_nick_value('Vikings', 'testkey') == 'other-nick-value'
Esempio n. 12
0
def trakt(bot, trigger):
    user = trigger.group(2)

    if not user:
        db = SopelDB(bot.config)
        user = db.get_nick_value(trigger.nick, 'trakt_user')
        if not user:
            bot.say('User not given or set. Use .traktset to set your user')
            return

    r = requests.get(bot.memory['trakt']['hist_url'].format(user),
                     headers=bot.memory['trakt']['headers'])

    if r.status_code == 404:
        bot.say('User {} does not exist'.format(user))
        return

    if len(r.json()) == 0:
        bot.say('User {} has no history'.format(user))
        return

    last = r.json()[0]

    if last['type'] == 'episode':
        meta = [user,
                last['show']['title'],
                last['episode']['season'],
                last['episode']['number'],
                last['episode']['title']]
        out = '{} last watched: {} {}x{:02} - {}'.format(*meta)
    elif last['type'] == 'movie':
        meta = [user,
                last['movie']['title'],
                last['movie']['year']]
        out = '{} last watched: {} ({})'.format(*meta)

    bot.say(out)
Esempio n. 13
0
File: test_db.py Progetto: dgw/sopel
def test_get_nick_value_default(db: SopelDB):
    assert db.get_nick_value("TerryGilliam", "nokey") is None
    assert db.get_nick_value("TerryGilliam", "nokey", "default") == "default"
Esempio n. 14
0
File: test_db.py Progetto: dgw/sopel
def test_set_nick_value(db: SopelDB, value):
    nick = 'Pepperpots'
    db.set_nick_value(nick, 'testkey', value)
    assert db.get_nick_value(nick, 'testkey') == value, (
        'The value retrieved must be exactly what was stored.')
Esempio n. 15
0
class BotDatabase():

    def __init__(self):

        SopelDB.nick_id_lock = threading.Lock()

        sopel.db.NickIDs = NickIDs
        sopel.db.Nicknames = Nicknames
        sopel.db.NickValues = NickValues
        SopelDB.get_nick_id = SpiceDB.get_nick_id
        SopelDB.get_nick_value = SpiceDB.get_nick_value
        SopelDB.set_nick_value = SpiceDB.set_nick_value
        SopelDB.delete_nick_value = SpiceDB.delete_nick_value
        SopelDB.adjust_nick_value = SpiceDB.adjust_nick_value
        SopelDB.adjust_nick_list = SpiceDB.adjust_nick_list

        sopel.db.ChannelValues = ChannelValues
        SopelDB.get_channel_value = SpiceDB.get_channel_value
        SopelDB.set_channel_value = SpiceDB.set_channel_value
        SopelDB.delete_channel_value = SpiceDB.delete_channel_value
        SopelDB.adjust_channel_value = SpiceDB.adjust_channel_value
        SopelDB.adjust_channel_list = SpiceDB.adjust_channel_list

        sopel.db.ServerValues = ServerValues
        SopelDB.get_server_value = SpiceDB.get_server_value
        SopelDB.set_server_value = SpiceDB.set_server_value
        SopelDB.delete_server_value = SpiceDB.delete_server_value
        SopelDB.adjust_server_value = SpiceDB.adjust_server_value
        SopelDB.adjust_server_list = SpiceDB.adjust_server_list

        sopel.db.PluginValues = PluginValues
        SopelDB.get_plugin_value = SpiceDB.get_plugin_value
        SopelDB.set_plugin_value = SpiceDB.set_plugin_value
        SopelDB.delete_plugin_value = SpiceDB.delete_plugin_value
        SopelDB.adjust_plugin_value = SpiceDB.adjust_plugin_value
        SopelDB.adjust_plugin_list = SpiceDB.adjust_plugin_list

        self.db = SopelDB(botconfig.config)
        BASE.metadata.create_all(self.db.engine)

    """Nick"""

    def get_nick_id(self, nick, create=True):
        return self.db.get_nick_id(nick, create)

    def alias_nick(self, nick, alias):
        return self.db.alias_nick(nick, alias)

    def unalias_nick(self, alias):
        return self.db.unalias_nick(alias)

    def check_nick_id(self, nick):
        try:
            self.db.get_nick_id(nick, create=False)
            return True
        except ValueError:
            return False

    def get_nick_value(self, nick, key, namespace='default'):
        return self.db.get_nick_value(nick, key, namespace)

    def set_nick_value(self, nick, key, value, namespace='default'):
        return self.db.set_nick_value(nick, key, value, namespace)

    def delete_nick_value(self, nick, key, namespace='default'):
        return self.db.delete_nick_value(nick, key, namespace)

    def adjust_nick_value(self, nick, key, value, namespace='default'):
        return self.db.adjust_nick_value(nick, key, value, namespace)

    def adjust_nick_list(self, nick, key, entries, adjustmentdirection, namespace='default'):
        return self.db.adjust_nick_list(nick, key, entries, adjustmentdirection, namespace)

    """Bot"""

    def get_bot_value(self, key, namespace='default'):
        return self.db.get_nick_value(botconfig.nick, key, namespace)

    def set_bot_value(self, key, value, namespace='default'):
        return self.db.set_nick_value(botconfig.nick, key, value, namespace)

    def delete_bot_value(self, key, namespace='default'):
        return self.db.delete_nick_value(botconfig.nick, key, namespace)

    def adjust_bot_value(self, key, value, namespace='default'):
        return self.db.adjust_nick_value(botconfig.nick, key, value, namespace)

    def adjust_bot_list(self, key, entries, adjustmentdirection, namespace='default'):
        return self.db.adjust_nick_list(botconfig.nick, key, entries, adjustmentdirection, namespace)

    """Channels"""

    def get_channel_value(self, channel, key, namespace='default'):
        return self.db.get_channel_value(channel, key, namespace)

    def set_channel_value(self, channel, key, value, namespace='default'):
        return self.db.set_channel_value(channel, key, value, namespace)

    def delete_channel_value(self, channel, key, namespace='default'):
        return self.db.delete_channel_value(channel, key, namespace)

    def adjust_channel_value(self, channel, key, value, namespace='default'):
        return self.db.adjust_channel_value(channel, key, value, namespace)

    def adjust_channel_list(self, nick, key, entries, adjustmentdirection, namespace='default'):
        return self.db.adjust_channel_list(nick, key, entries, adjustmentdirection, namespace)

    """Servers"""

    def get_server_value(self, _server, key, namespace='default'):
        return self.db.get__server_value(_server, key, namespace)

    def set__server_value(self, _server, key, value, namespace='default'):
        return self.db.set__server_value(_server, key, value, namespace)

    def delete__server_value(self, _server, key, namespace='default'):
        return self.db.delete__server_value(_server, key, namespace)

    def adjust__server_value(self, _server, key, value, namespace='default'):
        return self.db.adjust__server_value(_server, key, value, namespace)

    def adjust__server_list(self, nick, key, entries, adjustmentdirection, namespace='default'):
        return self.db.adjust__server_list(nick, key, entries, adjustmentdirection, namespace)

    """Plugins"""

    def get_plugin_value(self, plugin, key, namespace='default'):
        return self.db.get_plugin_value(plugin, key, namespace)

    def set_plugin_value(self, plugin, key, value, namespace='default'):
        return self.db.set_plugin_value(plugin, key, value, namespace)

    def delete_plugin_value(self, plugin, key, namespace='default'):
        return self.db.delete_plugin_value(plugin, key, namespace)

    def adjust_plugin_value(self, plugin, key, value, namespace='default'):
        return self.db.adjust_plugin_value(plugin, key, value, namespace)

    def adjust_plugin_list(self, plugin, key, entries, adjustmentdirection, namespace='default'):
        return self.db.adjust_plugin_list(plugin, key, entries, adjustmentdirection, namespace)
Esempio n. 16
0
class BotDatabase():
    def __init__(self):
        self.db = None
        self.dict = {
            "bot": {
                "nick": None,
            },
        }

    def initialize(self, config):
        SopelDB.adjust_nick_value = SpiceDB.adjust_nick_value
        SopelDB.adjust_nick_list = SpiceDB.adjust_nick_list

        SopelDB.adjust_channel_value = SpiceDB.adjust_channel_value
        SopelDB.adjust_channel_list = SpiceDB.adjust_channel_list

        SopelDB.adjust_plugin_value = SpiceDB.adjust_plugin_value
        SopelDB.adjust_plugin_list = SpiceDB.adjust_plugin_list

        self.db = SopelDB(config)
        BASE.metadata.create_all(self.db.engine)
        self.dict["bot"]["nick"] = config.core.nick

    def __getattr__(self, name):
        ''' will only get called for undefined attributes '''
        if hasattr(self.db, name):
            return eval("self.db." + name)
        else:
            return None

    """Nick"""

    def adjust_nick_value(self, nick, key, value):
        return self.db.adjust_nick_value(nick, key, value)

    def adjust_nick_list(self, nick, key, entries, adjustmentdirection):
        return self.db.adjust_nick_list(nick, key, entries,
                                        adjustmentdirection)

    """Bot"""

    def get_bot_value(self, key):
        return self.db.get_nick_value(self.dict["bot"]["nick"], key)

    def set_bot_value(self, key, value):
        return self.db.set_nick_value(self.dict["bot"]["nick"], key, value)

    def delete_bot_value(self, key):
        return self.db.delete_nick_value(self.dict["bot"]["nick"], key)

    def adjust_bot_value(self, key, value):
        return self.db.adjust_nick_value(self.dict["bot"]["nick"], key, value)

    def adjust_bot_list(self, key, entries, adjustmentdirection):
        return self.db.adjust_nick_list(self.dict["bot"]["nick"], key, entries,
                                        adjustmentdirection)

    """Channels"""

    def adjust_channel_value(self, channel, key, value):
        return self.db.adjust_channel_value(channel, key, value)

    def adjust_channel_list(self, nick, key, entries, adjustmentdirection):
        return self.db.adjust_channel_list(nick, key, entries,
                                           adjustmentdirection)

    """Plugins"""

    def adjust_plugin_value(self, plugin, key, value):
        return self.db.adjust_plugin_value(plugin, key, value)

    def adjust_plugin_list(self, plugin, key, entries, adjustmentdirection):
        return self.db.adjust_plugin_list(plugin, key, entries,
                                          adjustmentdirection)