예제 #1
0
class SpeakerTwitter(object):

    def __init__(self, speakerbot=None):
        self.db = SpeakerDB()
        self.theme_songs = {}
        self.speakerbot = speakerbot
        self.config = config["twitter"]
        self.twitter = Twython(
            self.config["app_key"], 
            self.config["app_secret"], 
            self.config["oauth_token"], 
            self.config["oauth_token_secret"])

    def publish_from_queue(self):

        forbidden_words = ["nohodo", "vk", "vertical knowledge", "d ", "rape", "raping", "rapeing", "rapin"]

        try:
            tweet_record = self.db.execute("select id, tweet_text from publish_queue limit 1").next()
        except StopIteration:
            tweet_record = False

        if tweet_record:
            tweet_text = unicode(tweet_record["tweet_text"])
            tweet_id = tweet_record["id"]

            tweet_this = True
            for word in forbidden_words:
                if word in tweet_text.lower():
                    tweet_this = False

            if tweet_this:
                try:
                    self.twitter.update_status(status=tweet_text)
                except TwythonError as e:
                    print str(e)
                    print "---------"
                    print tweet_text
                    pass
                
            self.db.execute("delete from publish_queue where id=?", [tweet_id])
예제 #2
0
class Speakonomy:
    __metaclass__ = Singleton

    def __init__(self, speakerbot=None, disabled=False):
        self.db = SpeakerDB()
        self.speakerbot = speakerbot
        self.disabled = disabled
        self.free_play_timeout = None

    def check_affordability(self, sound_name=None, cost=None, free=False):
        if not self.is_active() or free:
            return True
        if not cost:
            cost = self.db.execute("SELECT cost FROM sounds WHERE name=?", [
                sound_name,
            ]).fetchone()['cost']
        balance = self.get_speakerbuck_balance()
        if cost <= balance:
            return True
        return False

    def deposit_funds(self, amount=1):
        self.db.execute("UPDATE bank_account set balance=balance+?", [
            amount,
        ])
        self.db.execute("UPDATE bank_account set balance=0 WHERE balance<0")

    def get_free_play_timeout(self, force_check=False):

        if self.free_play_timeout and not force_check:
            return self.free_play_timeout

        expiration_timestamp = self.db.execute(
            "SELECT free_play_timeout FROM bank_account").fetchone(
            )['free_play_timeout']
        self.free_play_timeout = dt.datetime.fromtimestamp(
            expiration_timestamp)

        return self.free_play_timeout

    def get_last_withdrawal_time(self, include_sbpm=False):
        last_withdrawal_time = self.db.execute(
            "SELECT last_withdrawal_time FROM bank_account").fetchone(
            )['last_withdrawal_time']
        last_withdrawal_time = dt.datetime.fromtimestamp(last_withdrawal_time)
        if not include_sbpm:
            return last_withdrawal_time

        today_time = dt.datetime.combine(dt.date.today(), dt.time(8, 00))
        if last_withdrawal_time < today_time:
            last_withdrawal_time = today_time

        minutes_since_last_withdrawal = (
            dt.datetime.now() - last_withdrawal_time).total_seconds() / 60

        spbm = int((minutes_since_last_withdrawal + 9) / 10)
        return last_withdrawal_time, spbm

    def get_speakerbuck_balance(self):
        balance = self.db.execute(
            "SELECT balance FROM bank_account").fetchone()
        if balance:
            return balance['balance']
        return 0

    def is_active(self, force_check=False):
        if config.get("force_speakonomy", False):
            return True

        if self.disabled:
            return False
        if dt.datetime.today().weekday() in [5, 6]:
            return False

        current_hour = dt.datetime.now().hour
        if current_hour < 8 or current_hour > 18:
            return False

        if dt.datetime.now() < self.get_free_play_timeout(
                force_check=force_check):
            return False

        return True

    def regulate_costs(self):
        self.db.execute(
            "UPDATE sounds set cost=FLOOR(0.95*cost+0.05*base_cost) WHERE cost > base_cost"
        )
        self.db.execute(
            "UPDATE sounds set cost=base_cost WHERE cost < base_cost")

    def sell_sound(self, sound_name, **kwargs):
        if self.is_active() and not kwargs.get('free'):
            cost = int(
                self.db.execute("SELECT cost FROM sounds WHERE name=?", [
                    sound_name,
                ]).fetchone()['cost'])
            self.withdraw_funds(cost)
            self.db.execute("UPDATE sounds set cost=cost*2 where name=?", [
                sound_name,
            ])
            self.speakerbot.sounds[sound_name].cost = cost * 2

    def sell_saying(self, speech_text, **kwargs):
        if self.is_active():
            speech_cost = len(re.sub(r'[^a-z0-9]', '', speech_text,
                                     flags=re.I)) * 2
            self.withdraw_funds(speech_cost)

    def set_free_play_timeout(self,
                              expiration_datetime=None,
                              hours=0,
                              minutes=0):
        if not expiration_datetime:
            expiration_datetime = dt.datetime.now() + dt.timedelta(
                hours=hours, minutes=minutes)
        expiration_timestamp = expiration_datetime.strftime("%s")
        self.db.execute("UPDATE bank_account SET free_play_timeout=?", [
            expiration_timestamp,
        ])

        self.free_play_timeout = dt.datetime.fromtimestamp(
            float(expiration_timestamp))

    def get_sound_base_cost(self, sound_path):
        try:
            sound_size = os.stat(sound_path).st_size
            sound_cost = int(sound_size / 1024 * 0.0854455 - 0.0953288 + 0.5)
            if sound_cost < 1:
                sound_cost = 1
        except:
            sound_cost = 0
        return sound_cost

    def set_sound_base_costs(self, sound_dir="sounds"):
        assert self.speakerbot != None
        if not self.speakerbot.sounds:
            self.speakerbot.load_sounds()

        for sound_name in self.speakerbot.sounds:

            sound_path = '{}/{}'.format(sound_dir,
                                        self.speakerbot.sounds[sound_name][0])
            sound_cost = self.get_sound_base_cost(sound_path)

            self.db.execute(
                "UPDATE sounds SET base_cost={} where name='{}'".format(
                    sound_cost, sound_name))

    def withdraw_funds(self, amount):
        if self.is_active(True):
            self.deposit_funds(amount=-1 * amount)
            withdrawal_time = dt.datetime.now().strftime("%s")
            self.db.execute(
                "UPDATE bank_account SET last_withdrawal_time={}".format(
                    withdrawal_time))
예제 #3
0
class SpeakerbotDJ:

    def __init__(self, speakerbot=None):
        self.db = SpeakerDB()
        self.theme_songs = {}
        self.speakerbot = speakerbot
        self.last_theme_cache_time = dt.datetime.min

    def extract_email_field(self, s, field):
        field_match = re.search(r'^\s*{}:\s+(.*?)\s*$'.format(re.escape(field)), s, flags=re.I|re.M)
        if not field_match:
            return None
        return field_match.group(1)

    def cache_theme_songs(self):
        sb.load_sounds()
        results = self.db.execute("SELECT name, theme_song, last_theme_play_time FROM person").fetchall()
        for result in results:
            play_ok = True
            if result['last_theme_play_time']:
                last_theme_play_time = dt.datetime.fromtimestamp(result['last_theme_play_time'])
                minutes_since_last_theme = (dt.datetime.now() - last_theme_play_time).total_seconds() / 60
                if minutes_since_last_theme < 15:
                    play_ok = False

            self.theme_songs[minimize_string(result['name'])] = (result['name'], result['theme_song'], play_ok)
        self.last_theme_cache_time = dt.datetime.now()

    def check_for_entrance(self):
        # Needs cleanup... 
        mail = imaplib.IMAP4(config['email']['host'])
        mail.login(config['email']['user'], config['email']['pass'])
        mail.select()
        (retcode, messages) = mail.search(None, '(UNSEEN)')
        if retcode != 'OK':
            print 'Unknown error'
            return
        if len(messages[0]) == 0:
            return

        for message_number in messages[0].split(' '):
            (ret, data) = mail.fetch(message_number, '(RFC822)')
            email_body = str(email.message_from_string(data[0][1]))

            user = self.extract_email_field(email_body, 'User')
            door = self.extract_email_field(email_body, 'Door')
            if not door:
                door = self.extract_email_field(email_body, 'Elevator')
            # date = self.extract_email_field(email_body, 'Date')
            # time = self.extract_email_field(email_body, 'Time')
            # entry_time = dt.datetime.strptime(date+' '+time, '%m/%d/%y %I:%M:%S %p EDT')
            if not user:
                print "No user"
                continue
            user = minimize_string(user)
            door = minimize_string(door)
            #lookup theme song based on user
            if not self.theme_songs.get(user):
                print "Unrecognized user:"******"USER: [{}] DOOR: [{}]".format(user, door)
            real_name, theme_song, play_ok = self.theme_songs[user]

            if not theme_song or not play_ok:
                print "No theme song or play_ok"
                continue
            if door in ['mezstairdevhall','nstair2labdrb1n1mezz','nhall2labdrb2n2mezz']:
                print 'queue now'
            elif door in ['sstairdrb2n1serv']:
                print 'queue in 45 seconds'
                sleep(45)
            elif door in ['1stflelevbutton']:
                print 'queue in 60 seconds'
                sleep(60)
            else:
                print 'Unknown door:', door
                continue

            # Hackaround to avoid economy
            sb._play(theme_song)
            theme_play_time = dt.datetime.now().strftime("%s")
            self.db.execute("UPDATE person SET last_theme_play_time=? WHERE name=?", [theme_play_time, real_name])
            self.cache_theme_songs()
        mail.close()
예제 #4
0
class Speakonomy:
    __metaclass__ = Singleton

    def __init__(self, speakerbot=None, disabled=False):
        self.db = SpeakerDB()
        self.speakerbot = speakerbot
        self.disabled = disabled
        self.free_play_timeout = None

    def check_affordability(self, sound_name=None, cost=None, free=False):
        if not self.is_active() or free:
            return True
        if not cost:
            cost = self.db.execute("SELECT cost FROM sounds WHERE name=?", [sound_name,]).fetchone()['cost']
        balance = self.get_speakerbuck_balance()
        if cost <= balance:
            return True
        return False

    def deposit_funds(self, amount=1):
        self.db.execute("UPDATE bank_account set balance=balance+?", [amount,])
        self.db.execute("UPDATE bank_account set balance=0 WHERE balance<0")

    def get_free_play_timeout(self, force_check=False):

        if self.free_play_timeout and not force_check:
            return self.free_play_timeout

        expiration_timestamp = self.db.execute("SELECT free_play_timeout FROM bank_account").fetchone()['free_play_timeout']
        self.free_play_timeout = dt.datetime.fromtimestamp(expiration_timestamp)

        return self.free_play_timeout

    def get_last_withdrawal_time(self, include_sbpm=False):
        last_withdrawal_time = self.db.execute("SELECT last_withdrawal_time FROM bank_account").fetchone()['last_withdrawal_time']
        last_withdrawal_time = dt.datetime.fromtimestamp(last_withdrawal_time)
        if not include_sbpm:
            return last_withdrawal_time

        today_time = dt.datetime.combine(dt.date.today(), dt.time(8, 00))
        if last_withdrawal_time < today_time:
            last_withdrawal_time = today_time

        minutes_since_last_withdrawal = (dt.datetime.now() - last_withdrawal_time).total_seconds() / 60
        
        spbm = int((minutes_since_last_withdrawal + 9) / 10)
        return last_withdrawal_time, spbm

    def get_speakerbuck_balance(self):
        balance = self.db.execute("SELECT balance FROM bank_account").fetchone()
        if balance:
            return balance['balance']
        return 0

    def is_active(self, force_check=False):
        if config.get("force_speakonomy", False):
            return True

        if self.disabled:
            return False
        if dt.datetime.today().weekday() in [5,6]:
            return False
            
        current_hour = dt.datetime.now().hour
        if current_hour < 8 or current_hour > 18:
            return False

        if dt.datetime.now() < self.get_free_play_timeout(force_check=force_check):
            return False

        return True

    def regulate_costs(self):
        self.db.execute("UPDATE sounds set cost=FLOOR(0.95*cost+0.05*base_cost) WHERE cost > base_cost")
        self.db.execute("UPDATE sounds set cost=base_cost WHERE cost < base_cost")

    def sell_sound(self, sound_name, **kwargs):
        if self.is_active() and not kwargs.get('free'):
            cost = int(self.db.execute("SELECT cost FROM sounds WHERE name=?", [sound_name,]).fetchone()['cost'])
            self.withdraw_funds(cost)
            self.db.execute("UPDATE sounds set cost=cost*2 where name=?", [sound_name,])
            self.speakerbot.sounds[sound_name].cost = cost * 2

    def sell_saying(self, speech_text, **kwargs):
        if self.is_active():
            speech_cost = len(re.sub(r'[^a-z0-9]', '', speech_text, flags=re.I)) * 2
            self.withdraw_funds(speech_cost)

    def set_free_play_timeout(self, expiration_datetime=None, hours=0, minutes=0):
        if not expiration_datetime:
            expiration_datetime = dt.datetime.now() + dt.timedelta(hours=hours, minutes=minutes)
        expiration_timestamp = expiration_datetime.strftime("%s")
        self.db.execute("UPDATE bank_account SET free_play_timeout=?", [expiration_timestamp,])

        self.free_play_timeout = dt.datetime.fromtimestamp(float(expiration_timestamp))

    def get_sound_base_cost(self, sound_path):
        try:
            sound_size = os.stat(sound_path).st_size
            sound_cost = int(sound_size/1024 * 0.0854455 - 0.0953288 + 0.5)
            if sound_cost < 1:
                sound_cost = 1
        except:
            sound_cost = 0
        return sound_cost

    def set_sound_base_costs(self, sound_dir="sounds"):
        assert self.speakerbot != None
        if not self.speakerbot.sounds:
            self.speakerbot.load_sounds()

        for sound_name in self.speakerbot.sounds:
            
            sound_path = '{}/{}'.format(sound_dir, self.speakerbot.sounds[sound_name][0])
            sound_cost = self.get_sound_base_cost(sound_path)

            self.db.execute("UPDATE sounds SET base_cost={} where name='{}'".format(sound_cost, sound_name))

    def withdraw_funds(self, amount):
        if self.is_active(True):
            self.deposit_funds(amount=-1*amount)
            withdrawal_time = dt.datetime.now().strftime("%s")
            self.db.execute("UPDATE bank_account SET last_withdrawal_time={}".format(withdrawal_time))    
예제 #5
0
class SpeakerbotDJ:

    def __init__(self, speakerbot=None):
        self.db = SpeakerDB()
        self.theme_songs = {}
        self.speakerbot = speakerbot
        self.last_theme_cache_time = dt.datetime.min

    def extract_email_field(self, s, field):
        field_match = re.search(r'>\s*{}:\s+(.*?)\s*<'.format(re.escape(field)), s, flags=re.I|re.M)
        if not field_match:
            return None
        return field_match.group(1)

    def cache_theme_songs(self):
        sb.load_sounds()
        results = self.db.execute("SELECT name, theme_song, last_theme_play_time FROM person").fetchall()
        for result in results:
            play_ok = True
            if result['last_theme_play_time']:
                last_theme_play_time = dt.datetime.fromtimestamp(result['last_theme_play_time'])
                minutes_since_last_theme = (dt.datetime.now() - last_theme_play_time).total_seconds() / 60
                if minutes_since_last_theme < 15:
                    play_ok = False

            self.theme_songs[minimize_string(result['name'])] = (result['name'], result['theme_song'], play_ok)
        self.last_theme_cache_time = dt.datetime.now()

    def check_for_entrance(self):
        # Needs cleanup... 
        mail = imaplib.IMAP4(config['email']['host'])
        mail.login(config['email']['user'], config['email']['pass'])
        mail.select()
        (retcode, messages) = mail.search(None, '(UNSEEN)')
        if retcode != 'OK':
            print 'Unknown error'
            return
        if len(messages[0]) == 0:
            return

        for message_number in messages[0].split(' '):
            (ret, data) = mail.fetch(message_number, '(RFC822)')
            email_body = str(email.message_from_string(data[0][1]))

            user = self.extract_email_field(email_body, 'User')
            door = self.extract_email_field(email_body, 'Door')
            if not door:
                door = self.extract_email_field(email_body, 'Elevator')
            # date = self.extract_email_field(email_body, 'Date')
            # time = self.extract_email_field(email_body, 'Time')
            # entry_time = dt.datetime.strptime(date+' '+time, '%m/%d/%y %I:%M:%S %p EDT')
            if not user:
                print "No user"
                continue
            user = minimize_string(user)
            door = minimize_string(door)
            #lookup theme song based on user
            if not self.theme_songs.get(user):
                print "Unrecognized user:"******"USER: [{}] DOOR: [{}]".format(user, door)
            real_name, theme_song, play_ok = self.theme_songs[user]

            if not theme_song or not play_ok:
                print "No theme song or play_ok"
                continue
            if door in ['mezstairdevhall','nstair2labdrb1n1mezz','nhall2labdrb2n2mezz']:
                print 'queue now'
            elif door in ['sstairdrb2n1serv']:
                print 'queue in 45 seconds'
                sleep(45)
            elif door in ['1stflelevbutton']:
                print 'queue in 60 seconds'
                sleep(60)
            else:
                print 'Unknown door:', door
                continue

            # Hackaround to avoid economy
            sb._play(theme_song)
            theme_play_time = dt.datetime.now().strftime("%s")
            self.db.execute("UPDATE person SET last_theme_play_time=? WHERE name=?", [theme_play_time, real_name])
            self.cache_theme_songs()
        mail.close()