Пример #1
0
def main():
    update_id = None
    global BASE_URL
    logging.basicConfig(filename="botlog.log", format="%(asctime)s - %(name)s - %(levelname)s - %(message)s")

    logging.getLogger().addHandler(logging.StreamHandler())

    bot = telegram.Bot(token=os.environ.get("TG_BOT_TOKEN"))

    try:
        LAST_UPDATE_ID = bot.getUpdates()[-1].update_id
    except IndexError:
        LAST_UPDATE_ID = None

    # keywords
    dota_words = ["dota", "dotes"]
    dota_queries = ["when", "happening"]
    stack_queries = ["5 stack", "5stack", "stacked"]
    greetings = ["hello", "hi", "hey"]
    goodbyes = ["goodbye", "bye", "laters", "cya"]
    thanks = ["thanks", "cheers", "nice one"]
    gainz_words = ["gainz"]
    dota_checked = False
    # long polling skybeard bot
    while True:

        # Does a dota event exist?
        # Get updates from bot. 10s timeout on poll, update on new message
        try:

            try:
                dotes
            except NameError:
                dota_exists = False
            else:
                dota_exists = True

            for update in bot.getUpdates(offset=update_id, timeout=10):
                chat_id = update.message.chat_id
                message = update.message
                text = update.message.text.encode("utf-8")
                user = update.message.from_user

                if dota_exists and not dota_checked:
                    dota_t_check = dotes.tcheck(message)
                    logging.info("checked", update_id)
                    if dota_t_check:
                        dota_checked = True

                ############ MESSAGE HANDLING ############
                ##########################################

                # location testing
                if message.location:
                    bf.locCheck(bot, message)
                # test photo sending is working
                if bf.command("/phototest", text):
                    bf.postImage(text.split("/phototest ", 1)[1], chat_id, BASE_URL)

                # post space cat pics
                if bf.command("give me spacecats", text) or bf.command("show me spacecats", text):
                    bf.postCats(bot, message)

                # send help text
                if bf.command("/help", text):
                    bf.sendText(bot, chat_id, msg_texts.help())

                if bf.command("/weather", text):  # does not work in python2.6
                    imgPath = bf.forecast(bot, message)
                    bf.postImage(imgPath, chat_id, BASE_URL)

                if bf.command("/movie", text):
                    try:
                        title = text.split("/movie ", 1)[1]
                    except:
                        bf.sendText(bot, chat_id, "Please specify a film title")
                    else:
                        bf.movies(bot, message, title)

                if bf.command("/register", text):
                    reg.regCats(bot, message)

                if bf.command("/catabase", text):
                    reg.printCats(bot, message)

                if bf.command("/catdump", text):
                    reg.dumpCats(bot, message)

                if bf.command("/delete cat", text):
                    reg.deleteCat(bot, message)

                if bf.command("/echo", text):
                    bf.echocats(bot, message)

                # send top dota feeders table and graph
                if bf.command("/topfeeds", text):
                    if "update" in text.lower():
                        update_feeds = True
                    else:
                        update_feeds = False
                    imgPath = bf.feeding(bot, message, update_feeds)
                    bf.postImage(imgPath, chat_id, BASE_URL)

                # post last dota match details of user
                if bf.command("/lastmatch", text):
                    bf.last_match(bot, message)

                # create or modify time of dota event
                if bf.command("/dota", text):
                    dota_checked = False
                    time = events.get_time(bot, message)
                    if dota_exists:
                        dotes.set_time(time)
                        bf.sendText(bot, chat_id, "Dota time modified")
                        dotes.time_info(message)
                    else:
                        shotguns = events.get_str_list(bot, message, "with")
                        dotes = events.dota(bot, message, time)
                        logging.info("multi-shotgun:", shotguns)
                        if shotguns:
                            for cat in shotguns:
                                dotes.shotgun(message, cat)

                # delete dota event
                if bf.command("/delete dota", text):
                    if dota_exists:
                        bf.sendText(bot, chat_id, "Dota event deleted")
                        del dotes
                    else:
                        events.nodota(bot, message)

                # shotgun a place in dota
                if bf.command("shotgun!", text):
                    if dota_exists:
                        dotes.shotgun(message)
                    else:
                        events.nodota(bot, message)

                # unshotgun your place in dota
                if bf.command("unshotgun!", text):
                    if dota_exists:
                        dotes.unshotgun(message, "shotgun")
                    else:
                        events.nodota(bot, message)

                # ready up for dota
                if bf.command("unrdry!", text):
                    if dota_exists:
                        dotes.unshotgun(message, "rdry")
                    else:
                        events.nodota(bot, message)
                # un-ready up for dota
                if bf.command("rdry!", text):
                    if dota_exists:
                        dotes.rdry_up(message)
                    else:
                        events.nodota(bot, message)

                # post motivational lifting pics
                if bf.keywords(gainz_words, text.lower()):
                    bf.gainz(bot, chat_id, message)

                # reply to thank you messages
                if bf.keywords(thanks, text.lower()) and ("skybeard" in text.lower()):
                    bf.thank(bot, chat_id, message)

                # reply to greetings messages
                if bf.keywords(greetings, text.lower()) and ("skybeard" in text.lower()):
                    bf.greet(bot, chat_id, message)

                # reply to farewell messages
                if (bf.keywords(goodbyes, text.lower())) and ("skybeard" in text.lower()):
                    bf.goodbye(bot, chat_id, message)

                # respond to queries on wif dota is 5 stacked or not
                if bf.keywords(stack_queries, text.lower()):
                    if dota_exists:
                        dotes.stack(message)
                    else:
                        events.nodota(bot, message)

                # respond to queries about dota event details
                if bf.keywords(dota_queries, text.lower()) and ("dota" in text.lower()):
                    if dota_exists:
                        dotes.time_info(message)
                    else:
                        events.nodota(bot, message)
                update_id = update.update_id + 1

        except telegram.TelegramError as e:
            if e.message in ("Bad Gateway", "Timed out"):
                sleep(1)
            else:
                raise e
        except URLError as e:
            sleep(1)
Пример #2
0
def main():
    update_id = None
    motion_on = False
    global BASE_URL
    logging.basicConfig(format='%(asctime)s - %(name)s - %(levelname)s - %(message)s',file='botlog.log')

#    logging.getLogger().addHandler(logging.StreamHandler())

    bot = telegram.Bot(token=os.environ.get('TG_BOT_TOKEN'))

    try:
        LAST_UPDATE_ID = bot.getUpdates()[-1].update_id
    except IndexError:
        LAST_UPDATE_ID = None

    #keywords
    dota_words = ['dota','dotes']
    dota_queries = ['when','happening']
    stack_queries = ['5 stack','5stack','stacked']
    greetings = ['hello','hi','hey']
    goodbyes = ['goodbye','bye','laters','cya']
    thanks = ['thanks','cheers','nice one']
    gainz_words = ['gainz']
    dota_checked = False
    patch_check_time = datetime.datetime.now()
    tags = []
   
    #create Mycroft AI Adapt engine
    skb_intelligence  = af.skyAdapt()


    dotes = None
    bf.delDotaTable()
    #long polling skybeard bot
    while True:

        try:
           
            #Does a dota event exist?
           # try:
           #     dotes
           # except NameError:
           #     dota_exists = False
           # else:
           #     dota_exists = True
            
            ############## TIME CHECKS ##############
            #########################################           
            
            #checks if it's almost time for dota
            if (dotes and not dota_checked):
                dota_t_check = dotes.tcheck(message)
                logging.info("checked",update_id)
                if (dota_t_check):
                    dota_checked = True
            
            #checks for new dota patches hourly
#            if bf.expiry(patch_check_time,20):
 #               bf.postUpdate(bot,message)
                
            #deletes a dota event if it is 6 hours passed the event start time 
            if dotes and bf.expiry(dotes.date_dota,360):
                #logging.info('dota event expired',dotes.date_dota)
                dotes = None
                bf.delDotaTable()

            #rpi function time checks
            if rpi and motion_on:                
                rpf.checkMotion(bot)

            
            #Get updates from bot. 10s timeout on poll, update on new message
            for update in bot.getUpdates(offset=update_id, timeout=10):
                chat_id = update.message.chat_id
                message = update.message
                text = update.message.text.encode('utf-8')
                user = update.message.from_user
                
                ####test commands####
                #location testing
                if (message.location):
                    bf.locCheck(bot,message)
                
                #test photo sending is working (removed. Potentially dangerous!)
#                if bf.command('/phototest',text):
#                    bf.postImage(text.split('/phototest ',1)[1],chat_id,BASE_URL) 
               
                #test command for gym locator 
                if bf.command('/updategains',text):
                    bf.updateGainz(message)

                if bf.command('/motion',text):
                    if motion_on:
                        motion_on = False
                        bf.sendText(bot, chat_id, 'Motion detection halted')
                    elif not motion_on:    
#                        rpf.clearMotion()
                        rpf.resetMotion()
                        motion_on = True
                        bf.sendText(bot, chat_id, 'Motion detection resumed')
                
                if bf.command('/myid',text):
                    bf.sendText(bot, chat_id, user.id)

                ############ MESSAGE HANDLING ############
                ##########################################           
                
                #latest steam news post for game. Currently just Dota
                if(bf.command('/news',text)):
                    try:
                        title = text.split('/news ',1)[1]
                    except:
                        title = 'dota'
                    
                    if title == 'dota':    
                        bf.dotaNews(bot,message)
                    else:
                        bf.sendText(bot,chat_id,title+' is not a recognised steam game')
                
               
                #post space cat pics
                if bf.command('give me spacecats',text) or bf.command('show me spacecats',text):
                    bf.postCats(bot,message)
                
                #post corgi pics
                if bf.command('give me corgis',text) or bf.command('show me corgis',text):
                    bf.postCorgis(bot,message, BASE_URL)

                #send help text
                if bf.command('/help',text):
                    bf.sendText(bot,chat_id,msg_texts.help())
                    bf.sendText(bot,chat_id,msg_texts.readme())
                
                #weather forecast
                if bf.command('/weather',text):  #does not work in python2.6
                    bf.forecast(bot,message,BASE_URL)

                #movie lookup
                if bf.command('/movie',text):
                    try:
                        title = text.split('/movie ',1)[1]
                    except:
                        bf.sendText(bot,chat_id,'Please specify a film title')
                    else:
                        bf.movies(bot,message,title)
                
                #book lookup
                if bf.command('/book',text):
                    try:
                        title = text.split('/book ',1)[1]
                    except:
                        bf.sendText(bot,chat_id,'Please specify a book title')
                    else:
                        bf.bookSearch(bot,message,title)
                
                #display database entries which user has permission to see
                if bf.command('/catabase',text):
                    reg.printCats(bot,message)
                    
                #delete catabase entry
                if bf.command('/delete cat',text):
                    reg.deleteCat(bot,message)
                
                #banter command
                if bf.command('/echo',text):
                    bf.echocats(bot,message)

                #send top dota feeders table and graph
                if bf.command('/topfeeds',text):
                    if 'update' in text.lower():
                        update_feeds = True
                    else:
                        update_feeds = False
                    bf.feeding(bot,message,BASE_URL,update_feeds)
                
                #post last dota match details of user  
                if bf.command('/lastmatch',text):
                    bf.last_match(bot,message)
               
                if bf.command('/matches',text):
                    bf.matches(bot,message)

                if bf.command('#m_',text):
                    bf.last_match(bot,message,text.split('#m_',1)[1])

                #create or modify time of dota event
                if bf.command('/dota',text):
                    dota_checked = False
                    time = events.get_time(bot,message)
                    if (dotes):
                        dotes.set_time(time)
                        bf.sendText(bot,chat_id,'Dota time modified')
                        dotes.time_info(message)
                    else:    
                        shotguns = events.get_str_list(bot,message,'with')
                        dotes = events.dota(bot,message,time)
                        logging.info('multi-shotgun:',shotguns)
                        if shotguns:
                            for cat in shotguns:
                                dotes.shotgun(message,cat)


                
                #delete dota event
                if bf.command('/delete dota',text): 
                    if (dotes):
                        bf.sendText(bot,chat_id,'Dota event deleted')
                        dotes = None
                        bf.delDotaTable()
                    else:
                        events.nodota(bot,message)
                
                #shotgun a place in dota
                if bf.command('shotgun!',text):
                    if (dotes):
                        dotes.shotgun(message)
                    else:
                        events.nodota(bot,message)
                
                #unshotgun your place in dota
                if bf.command('unshotgun!',text):
                    if (dotes):
                        dotes.unshotgun(message,'shotgun')
                    else:
                        events.nodota(bot,message)
                
                #ready up for dota
                if bf.command('unrdry!',text):
                    if (dotes):
                        dotes.unshotgun(message,'rdry')
                    else:
                        events.nodota(bot,message)
                #un-ready up for dota
                if bf.command('rdry!',text):
                    if (dotes):
                        dotes.rdry_up(message)
                    else:
                        events.nodota(bot,message)
                
                #post motivational lifting pics
                if bf.keywords(gainz_words,text.lower()):
                    bf.gainz(bot,message)
                
                #reply to thank you messages
                if bf.keywords(thanks,text.lower()) and  ('skybeard' in text.lower()):
                    bf.thank(bot,chat_id,message)
                
                #reply to greetings messages
                if bf.keywords(greetings,text.lower()) and  ('skybeard' in text.lower()):
                    bf.greet(bot,chat_id,message)
                
                #reply to farewell messages
                if (bf.keywords(goodbyes,text.lower())) and ('skybeard' in text.lower()):
                    bf.goodbye(bot,chat_id,message)
                
                #respond to queries on if dota is 5 stacked or not
                if (bf.keywords(stack_queries,text.lower())):
                    if (dotes):
                        dotes.stack(message)
                    else:
                        events.nodota(bot,message)
                
                #respond to queries about dota event details        
          #      if bf.keywords(dota_queries,text.lower()) and ('dota' in text.lower()):
          #          if (dotes):
          #              dotes.time_info(message)
          #          else:
          #              events.nodota(bot,message)
                
                #AI tests
                intents = af.intentChecker(skb_intelligence, 0.3, text)
                try:
                    for intent in intents:
                        if intent['intent_type'] == 'DotaIntent':
                            events.dotaQuery(bot, message, dotes)
                        elif intent['intent_type'] == 'NewDotaIntent':
                            dota_checked = False
                            time = events.get_time(bot,message)
                            if (dotes):
                                dotes.set_time(time)
                                bf.sendText(bot,chat_id,'Dota time modified')
                                dotes.time_info(message)
                            else:    
                                shotguns = events.get_str_list(bot,message,'with')
                                dotes = events.dota(bot,message,time)
                                logging.info('multi-shotgun:',shotguns)
                                if shotguns:
                                    for cat in shotguns:
                                        dotes.shotgun(message,cat)
                        elif intent['intent_type'] == 'StackIntent':
                            if (dotes):
                                dotes.stack(message)
                            else:
                                events.nodota(bot,message)
                except:
                    print 'no intents detected'

                pending_tag = btools.keySearch(tags,'name',user.first_name.lower())
                if pending_tag and pending_tag['chat_id']==chat_id:
                    bf.tagReply(bot,message,pending_tag)
                    i = next(index for (index, entry) in enumerate(tags) if entry['name'] == pending_tag['name'])
                    tags.pop(i)
                
                tag_match = re.search(r'\/tag\s*(\w+)',text)
                if tag_match:
                    tags.append(bf.msgTag(bot,message,tag_match.group(1)))
              #  print tags
                
                update_id= update.update_id + 1

        except telegram.TelegramError as e:
            if e.message in ("Bad Gateway", "Timed out"):
                sleep(1)
            else:
                raise e
        except URLError as e:
            sleep(1)
Пример #3
0
    async def on_chat_message(self, msg):
        print(msg)
        # housekeeping
        if bf.expiry(patch_check_time,10):
            bf.postUpdate(bot,message)

        chat_id = msg['chat']['id']
        text = msg['text'] #.encode('utf-8')
        user = msg['from']['username']

        # A little hacking is needed here to make the message object fit the
        # old api
        #
        # TODO phase this out
        message = Namespace()
        message.chat_id = chat_id
        message.text = text
        message.from_user = Namespace()
        message.from_user.first_name = msg['from']['first_name']
        message.from_user.id = msg['from']['id']
        message.user = msg['from']['username']

        if(bf.command('/news',text)):
            try:
                title = text.split('/news ',1)[1]
            except:
                title = 'dota'

            if title == 'dota':
                bf.dotaNews(bot,message)
            else:
                bf.sendText(bot,chat_id,title+' is not a recognised steam game') #more steam games can be added

        #send help text
        if bf.command('/help',text):
            bf.sendText(bot,chat_id,msg_texts.help())
            bf.sendText(bot,chat_id,msg_texts.readme())

        #display database entries which user has permission to see
        if bf.command('/database',text):
            reg.printCats(bot,message)

        #delete catabase entry
        if bf.command('/delete cat',text):
            reg.deleteCat(bot,message)

        #banter command
        if bf.command('/echo',text):
            bf.echocats(bot,message)

        #send top dota feeders table and graph
        if bf.command('/topfeeds',text):
            if 'update' in text.lower():
                update_feeds = True
            else:
                update_feeds = False
            bf.feeding(bot,message,BASE_URL,update_feeds)

        #post last dota match details of user
        if bf.command('/lastmatch',text):
            bf.last_match(bot,message)

        if bf.command('/matches',text):
            bf.matches(bot,message)

        if bf.command('#m_',text):
            bf.last_match(bot,message,text.split('#m_',1)[1])

        #create or modify time of dota event
        if bf.command('/dota',text):
            try:
                await self.create_event(msg)
            except EventAlreadyPlanned:
                event = await self.get_future_event()
                await self.sender.sendMessage(
                    "Event already planned for {}".format(
                        event.start_datetime))
            # dota_checked = False
            # time = events.get_time(bot,message)
            # if (dotes):
            #     dotes.set_time(time)
            #     bf.sendText(bot,chat_id,'Dota time modified')
            #     dotes.time_info(message)
            # else:
            #     shotguns = events.get_str_list(bot,message,'with')
            #     dotes = events.dota(bot,message,time)
            #     logging.info('multi-shotgun:',shotguns)
            #     if shotguns:
            #         for cat in shotguns:
            #             dotes.shotgun(message,cat)

        #shotgun a place in dota
        if bf.command('shotgun!',text):
            # assert False, "Sorry, not implemented yet!"
            event = await self.get_future_event()
            if event:
                try:
                    await self.add_person_to_event(
                        event,
                        {"name": msg["from"]["username"]})
                    await self.sender.sendMessage(
                        "Your interest has been noted.")
                except PersonAlreadyAttending:
                    await self.sender.sendMessage(
                        "Your interest has already been noted.")
            else:
                await self.sender.sendMessage(
                    "I don't know about any Dota happening today.")

        #unshotgun your place in dota
        if bf.command('unshotgun!',text):
            event = await self.get_future_event()
            if event:
                try:
                    await self.remove_person_from_event(
                        event,
                        {"name": msg["from"]["username"]})
                    await self.sender.sendMessage(
                        "Your lack of interest has been noted.")
                except PersonNotAttending:
                    await self.sender.sendMessage(
                        "You were never going to this event.")
            else:
                await self.sender.sendMessage(
                    "I don't know about any Dota happening today.")

        # TODO
        #ready up for dota
        if bf.command('unready!',text):
            assert False, "Sorry, not implemented yet!"
            # if (dotes):
            #     dotes.unshotgun(message,'rdry')
            # else:
            #     events.nodota(bot,message)

        #un-ready up for dota
        if bf.command('ready!',text):
            assert False, "Sorry, not implemented yet!"
            # if (dotes):
            #     dotes.rdry_up(message)
            # else:
            #     events.nodota(bot,message)


        #reply to thank you messages
        if bf.keywords(thanks,text.lower()) and  ('skybeard' in text.lower()):
            bf.thank(bot,chat_id,message)

        #reply to greetings messages
        if bf.keywords(greetings,text.lower()) and  ('skybeard' in text.lower()):
            bf.greet(bot,chat_id,message)

        #reply to farewell messages
        if (bf.keywords(goodbyes,text.lower())) and ('skybeard' in text.lower()):
            bf.goodbye(bot,chat_id,message)

        #respond to queries on if dota is 5 stacked or not
        if bf.keywords(stack_queries, text.lower()):
            # assert False, "Sorry, not implemented!"
            event = await self.get_future_event()
            if event:
                await self.sender.sendMessage(
                    "There are currently {} people shotgunned.".format(
                        len(event.people_attending)))
            else:
                await self.sender.sendMessage("No dota scheduled at the moment.")
Пример #4
0
def main():
    update_id = None
    motion_on = False
    global BASE_URL
    logging.basicConfig(format='%(asctime)s - %(name)s - %(levelname)s - %(message)s',filename='botlog.log')

#    logging.getLogger().addHandler(logging.StreamHandler())

    bot = telegram.Bot(token=os.environ.get('TG_BOT_TOKEN'))

    try:
        LAST_UPDATE_ID = bot.getUpdates()[-1].update_id
    except IndexError:
        LAST_UPDATE_ID = None

    #keywords
    stack_queries = ['5 stack','5stack','stacked']
    greetings = ['hello','hi','hey']
    goodbyes = ['goodbye','bye','laters','cya']
    thanks = ['thanks','cheers','nice one']
    gainz_words = ['gainz']
    dota_checked = False
    patch_check_time = datetime.datetime.now()
    tags = []

    #create Mycroft AI Adapt engine
    skb_intelligence  = af.skyAdapt()


    dotes = None
    bf.delDotaTable()
    #long polling skybeard bot
    while True: #dirty

        try:    #even dirtier, oh my!

            ############## TIME CHECKS ##############
            #########################################

            #checks if it's almost time for dota
            if (dotes and not dota_checked):
                dota_t_check = dotes.tcheck(message)
                logging.info("checked",update_id)
                if (dota_t_check):
                    dota_checked = True

            #checks for new dota patches
            if bf.expiry(patch_check_time,10):
                bf.postUpdate(bot,message)

            #deletes a dota event if it is 6 hours passed the event start time
            if dotes and bf.expiry(dotes.date_dota,360):
                dotes = None
                bf.delDotaTable()

            #Get updates from bot. 10s timeout on poll, update on new message
            for update in bot.getUpdates(offset=update_id, timeout=10):
                chat_id = update.message.chat_id
                message = update.message
                text = update.message.text #.encode('utf-8')
                user = update.message.from_user


                if bf.command('/myid',text):
                    bf.sendText(bot, chat_id, user.id)

                ############ MESSAGE HANDLING ############
                ##########################################

                #latest steam news post for game. Currently just Dota
                if(bf.command('/news',text)):
                    try:
                        title = text.split('/news ',1)[1]
                    except:
                        title = 'dota'

                    if title == 'dota':
                        bf.dotaNews(bot,message)
                    else:
                        bf.sendText(bot,chat_id,title+' is not a recognised steam game') #more steam games can be added

                #send help text
                if bf.command('/help',text):
                    bf.sendText(bot,chat_id,msg_texts.help())
                    bf.sendText(bot,chat_id,msg_texts.readme())

                #display database entries which user has permission to see
                if bf.command('/database',text):
                    reg.printCats(bot,message)

                #delete catabase entry
                if bf.command('/delete cat',text):
                    reg.deleteCat(bot,message)

                #banter command
                if bf.command('/echo',text):
                    bf.echocats(bot,message)

                #send top dota feeders table and graph
                if bf.command('/topfeeds',text):
                    if 'update' in text.lower():
                        update_feeds = True
                    else:
                        update_feeds = False
                    bf.feeding(bot,message,BASE_URL,update_feeds)

                #post last dota match details of user
                if bf.command('/lastmatch',text):
                    bf.last_match(bot,message)

                if bf.command('/matches',text):
                    bf.matches(bot,message)

                if bf.command('#m_',text):
                    bf.last_match(bot,message,text.split('#m_',1)[1])

                #create or modify time of dota event
                if bf.command('/dota',text):
                    dota_checked = False
                    time = events.get_time(bot,message)
                    if (dotes):
                        dotes.set_time(time)
                        bf.sendText(bot,chat_id,'Dota time modified')
                        dotes.time_info(message)
                    else:
                        shotguns = events.get_str_list(bot,message,'with')
                        dotes = events.dota(bot,message,time)
                        logging.info('multi-shotgun:',shotguns)
                        if shotguns:
                            for cat in shotguns:
                                dotes.shotgun(message,cat)

                #delete dota event
                if bf.command('/delete dota',text):
                    if (dotes):
                        bf.sendText(bot,chat_id,'Dota event deleted')
                        dotes = None
                        bf.delDotaTable()
                    else:
                        events.nodota(bot,message)

                #shotgun a place in dota
                if bf.command('shotgun!',text):
                    if (dotes):
                        dotes.shotgun(message)
                    else:
                        events.nodota(bot,message)

                #unshotgun your place in dota
                if bf.command('unshotgun!',text):
                    if (dotes):
                        dotes.unshotgun(message,'shotgun')
                    else:
                        events.nodota(bot,message)

                #ready up for dota
                if bf.command('unready!',text):
                    if (dotes):
                        dotes.unshotgun(message,'rdry')
                    else:
                        events.nodota(bot,message)
                #un-ready up for dota
                if bf.command('ready!',text):
                    if (dotes):
                        dotes.rdry_up(message)
                    else:
                        events.nodota(bot,message)

                #reply to thank you messages
                if bf.keywords(thanks,text.lower()) and  ('skybeard' in text.lower()):
                    bf.thank(bot,chat_id,message)

                #reply to greetings messages
                if bf.keywords(greetings,text.lower()) and  ('skybeard' in text.lower()):
                    bf.greet(bot,chat_id,message)

                #reply to farewell messages
                if (bf.keywords(goodbyes,text.lower())) and ('skybeard' in text.lower()):
                    bf.goodbye(bot,chat_id,message)

                #respond to queries on if dota is 5 stacked or not
                if (bf.keywords(stack_queries,text.lower())):
                    if (dotes):
                        dotes.stack(message)
                    else:
                        events.nodota(bot,message)

                #AI tests
                intents = af.intentChecker(skb_intelligence, 0.3, text)
                try:
                    for intent in intents:
                        if intent['intent_type'] == 'DotaIntent':
                            events.dotaQuery(bot, message, dotes)
                        elif intent['intent_type'] == 'NewDotaIntent':
                            dota_checked = False
                            time = events.get_time(bot,message)
                            if (dotes):
                                dotes.set_time(time)
                                bf.sendText(bot,chat_id,'Dota time modified')
                                dotes.time_info(message)
                            else:
                                shotguns = events.get_str_list(bot,message,'with')
                                dotes = events.dota(bot,message,time)
                                logging.info('multi-shotgun:',shotguns)
                                if shotguns:
                                    for cat in shotguns:
                                        dotes.shotgun(message,cat)
                        elif intent['intent_type'] == 'StackIntent':
                            if (dotes):
                                dotes.stack(message)
                            else:
                                events.nodota(bot,message)
                except:
                    print('no intents detected')

                #tag someone in a message for the bot to send again when they're active in the chat
                pending_tag = btools.keySearch(tags,'name',user.first_name.lower())
                if pending_tag and pending_tag['chat_id']==chat_id:
                    bf.tagReply(bot,message,pending_tag)
                    i = next(index for (index, entry) in enumerate(tags) if entry['name'] == pending_tag['name'])
                    tags.pop(i)

                tag_match = re.search(r'\/tag\s*(\w+)',text)
                if tag_match:
                    tags.append(bf.msgTag(bot,message,tag_match.group(1)))
              #  print(tags)

                update_id= update.update_id + 1

        except telegram.TelegramError as e:
            if e.message in ("Bad Gateway", "Timed out"):
                sleep(1)
            else:
                raise e
        except URLError as e:
            sleep(1)
        except:                 # This is terrible, and it's my fault (nasfarley88)
            pass
Пример #5
0
def main():
    global LAST_UPDATE_ID

    logging.basicConfig(
        format='%(asctime)s - %(name)s - %(levelname)s - %(message)s')

    # Telegram Bot Authorization Token
    bot = telegram.Bot(token=os.environ.get('TG_BOT_TOKEN'))

    try:
        LAST_UPDATE_ID = bot.getUpdates()[-1].update_id
    except IndexError:
        LAST_UPDATE_ID = None

    #keywords
    dota_words = ['dota', 'dotes']
    dota_queries = ['when', 'happening']
    stack_queries = ['5 stack', '5stack', 'stacked']
    greetings = ['hello', 'hi', 'hey']
    goodbyes = ['goodbye', 'bye', 'laters', 'cya']
    gainz_words = [
        'gainz',
    ]

    #long polling skybeard bot
    while True:

        #Does a dota event exist?
        try:
            dotes
        except NameError:
            dota_exists = False
        else:
            dota_exists = True

        #Get updates from bot. 10s timeout
        for update in bot.getUpdates(offset=LAST_UPDATE_ID, timeout=10):
            chat_id = update.message.chat_id
            message = update.message
            text = update.message.text.encode('utf-8')
            user = update.message.from_user

            #Commands and keywords
            #Todo: See if this is less horrible with decorators
            if command('/help', text):
                sendText(bot, chat_id, msg_texts.help())

            if command('/topfeeds', text):
                feeding(bot, message)

            if command('/lastmatch', text):
                last_match(bot, message)

            if command('/dota', text):
                time = events.get_time(bot, message)
                dotes = events.dota(bot, message, time)

            if command('/delete dota', text):
                if (dota_exists):
                    sendText(bot, chat_id, 'Dota event deleted')
                    del dotes
                else:
                    events.nodota(bot, message)

            if command('shotgun!', text):
                if (dota_exists):
                    dotes.shotgun(message)
                else:
                    events.nodota(bot, message)

            if command('unshotgun!', text):
                if (dota_exists):
                    dotes.unshotgun(message, 'shotgun')
                else:
                    events.nodota(bot, message)

            if command('unrdry!', text):
                if (dota_exists):
                    dotes.unshotgun(message, 'rdry')
                else:
                    events.nodota(bot, message)

            if command('rdry!', text):
                if (dota_exists):
                    dotes.rdry_up(message)
                else:
                    events.nodota(bot, message)

            if keywords(gainz_words, text.lower()):
                gainz(bot, chat_id, message)

            if keywords(greetings, text.lower()) and ('skybeard'
                                                      in text.lower()):
                greet(bot, chat_id, message)

            if (keywords(goodbyes, text.lower())) and ('skybeard'
                                                       in text.lower()):
                goodbye(bot, chat_id, message)

            if (keywords(stack_queries, text.lower())):
                if (dota_exists):
                    dotes.stack(message)
                else:
                    events.nodota(bot, message)

            if keywords(dota_queries, text.lower()) and ('dota'
                                                         in text.lower()):
                if (dota_exists):
                    dotes.time_info(message)
                else:
                    events.nodota(bot, message)

        #Get new updates
        LAST_UPDATE_ID = update.update_id + 1