def getComuneProvinciaFromCoordinates(lat, lon): params = { 'language': 'it', 'latlng': '{},{}'.format(lat, lon), 'key': key.GOOGLE_API_KEY } resp = requests.get(googleapis_url, params=params) #logging.info('Response: {}'.format(resp.text)) #this might generate a UnicodeEncodeError: 'ascii' codec can't encode character u'\xe0' in position 607: ordinal not in range(128) responseJson = jsonUtil.json_loads_byteified(resp.text) if responseJson['status'] == 'OK': results = responseJson['results'] for result_item in results: address_components = result_item['address_components'] comune_field = [ x for x in address_components if x['types'] == ["administrative_area_level_3", "political"] ] comune = comune_field[0]["long_name"] if comune_field else None provincia_field = [ x for x in address_components if x['types'] == ["administrative_area_level_2", "political"] ] provincia = provincia_field[0][ "long_name"] if provincia_field else None if comune and provincia: return "{}, {}".format(comune, provincia) #return provincia #raise LookupError('Problem finding comune and provincia from coordinates {} {}'.format(lat, lon)) logging.debug("No comune found for {} {}".format(lat, lon)) return None
def post(self): from main import dealWithUserInteraction #urlfetch.set_default_fetch_deadline(60) body = jsonUtil.json_loads_byteified(self.request.body) logging.info('request body: {}'.format(body)) messaging = body['entry'][0]['messaging'][0] chat_id = messaging['sender']['id'] text = messaging.get('message', {}).get('text', '') if text=='': text = messaging.get('postback', {}).get('payload', '') #attachment = messaging.get('message', {}).get('attachments', [{}])[0] #voice_url = attachment.get('payload',{}).get('url',None) if attachment.get('type',None)=='audio' else None location = messaging.get('message', {}).get('attachments', [{}])[0].get('payload', {}).get('coordinates', None) # {"lat": 46.0, "long": 11.1} if location: location = {'latitude': location['lat'], 'longitude': location['long'] } # we need this as fb is send all sort of notification when user is active without sending any message if text=='' and location is None: return name, last_name = getUserInfo(chat_id) dealWithUserInteraction(chat_id, name=name, last_name=last_name, username=None, application='messenger', text=text, location=location, contact=None, photo=None, document=None, voice=None)
def post(self): from main import dealWithUserInteraction # urlfetch.set_default_fetch_deadline(60) body = jsonUtil.json_loads_byteified(self.request.body) logging.info('request body: {}'.format(body)) # self.response.write(json.dumps(body)) # update_id = body['update_id'] if 'message' not in body: return message = body['message'] if 'chat' not in message: return chat = message['chat'] chat_id = str(chat['id']) if 'first_name' not in chat: return text = message.get('text') if 'text' in message else '' name = chat['first_name'] last_name = chat['last_name'] if 'last_name' in chat else None username = chat['username'] if 'username' in chat else None location = message['location'] if 'location' in message else None contact = message['contact'] if 'contact' in message else None photo = message.get('photo') if 'photo' in message else None document = message.get('document') if 'document' in message else None voice = message.get('voice') if 'voice' in message else None dealWithUserInteraction( chat_id, name, last_name, username, application='telegram', text=text, location=location, contact=contact, photo=photo, document=document, voice=voice )
def getJsonElementStructureFromOverpass(url): #url = urllib.quote(url) logging.debug("Query overpass from url: " + url) try: responseString = urllib2.urlopen(url, timeout=MAX_TIMEOUT_SECONDS).read() except (httplib.HTTPException, socket.error) as err: logging.debug("Timeout exception in Overpass: {} ".format(str(err))) return None jsonStructure = jsonUtil.json_loads_byteified(responseString) return jsonStructure['elements']
def post(self): import key import person from main import send_message body = jsonUtil.json_loads_byteified(self.request.body) logging.debug("body: {}".format(body)) people_count = body['present'] setPiCounterValue(people_count) #katja = person.getPersonById(key.KATJA_T_ID) #send_message(katja, "People count: {} ".format(people_count)) people_in_stats = Person.query(Person.state == 5).fetch() for p in people_in_stats: send_message(p, "Posti occupati: {} ".format(people_count)) sleep(0.1)
def getMenuInfo(name): if name not in mensa_names: return None index = mensa_names.index(name) url = menu_info_url.format(index) r = requests.get(url) menu = jsonUtil.json_loads_byteified(r.text) primi = menu['first_plate'] primi_piatti = [str_plate(x) for x in primi] secondi = menu['second_plate'] secondi_piatti = [str_plate(x) for x in secondi] return '\n'.join([ "1️⃣ *PRIMI*:\n---------", '\n'.join(primi_piatti), "\n\n2️⃣ *SECONDI*:\n---------", '\n'.join(secondi_piatti) ])
def post(self): body = jsonUtil.json_loads_byteified(self.request.body) logging.info('request body:') logging.info(body) self.response.write(json.dumps(body)) if 'message' not in body: return message = body['message'] if "chat" not in message: return chat = message['chat'] chat_id = chat['id'] msg = "Ciao, ci siamo trasferiti su @DialettiBot!" send_message(chat_id, msg, remove_keyboard=True, url_api=key.DIALECT_API_URL)
def getLatLonDistancesFromGoogle(url, lat, lon, show_only_open=True): #url = urllib.quote(url) logging.debug("Query google places API from url: " + url) responseString = urllib2.urlopen(url, timeout=MAX_TIMEOUT_SECONDS).read() jsonStructure = jsonUtil.json_loads_byteified(responseString) elements = jsonStructure['results'] if elements: sortedElementsDistance = [] for e in elements: location = e['geometry']['location'] loc_lat = location['lat'] loc_lon = location['lng'] dist = geoUtils.distance((loc_lat, loc_lon), (lat, lon)) openNow = e["opening_hours"][ "open_now"] if "opening_hours" in e.keys() else False sortedElementsDistance.append((loc_lat, loc_lon, dist, openNow)) sortedElementsDistance.sort(key=lambda e: e[2]) #logging.debug("Retured elements: " + str(sortedElementsDistance)) return sortedElementsDistance return []
# -*- coding: utf-8 -*- import requests import jsonUtil import key base_url = 'https://00b501df.ngrok.io/RestfulService_war_exploded/restresources' mensa_info_url = base_url + '/cafeterias' menu_info_url = base_url + '/cafeteria/{}/menu' r = requests.get(mensa_info_url) mensa_info = jsonUtil.json_loads_byteified(r.text) mensa_names = [x['info']['name'] for x in mensa_info] mensa_name_loc = { x['info']['name']: x['info']['coordinates'] for x in mensa_info } def getInfoMensa(name): match = [x for x in mensa_info if x['info']['name'] == name] if match: entry = match[0] address = entry['info']['address'] capacity = entry['capacity'] takenSeats = entry['takenSeats'] orario_lunch = entry['info']['launch']["start"] + ' - ' + entry[ 'info']['launch']["end"] orario_dinner = entry['info']['dinner']["start"] + ' - ' + entry[ 'info']['dinner']["end"] #freeSeats = capacity-takenSeats return "*Nome*: {}\n" \
def post(self): body = jsonUtil.json_loads_byteified(self.request.body) logging.info('request body:') logging.info(body) self.response.write(json.dumps(body)) # update_id = body['update_id'] if 'message' not in body: return message = body['message'] #message_id = message.get('message_id') # date = message.get('date') if "chat" not in message: return # fr = message.get('from') chat = message['chat'] chat_id = chat['id'] if "first_name" not in chat: return text = message.get('text', "") name = chat["first_name"] last_name = chat.get("last_name", "-") username = chat.get("username", "-") location = message.get("location", None) voice = message.get("voice", None) #audio = message.get("audio", None) #document = message.get("document", None) logging.debug("Received input from {}. Text={} Location={}".format( chat_id, text, location)) def reply(msg=None, kb=None, markdown=True, inline_keyboard=False): send_message(chat_id, msg, kb=kb, markdown=markdown, inline_keyboard=inline_keyboard) p = person.getPersonByChatId(chat_id) if p is None: # new user logging.info("Text: " + text) if text == '/help': reply(ISTRUZIONI) if text.startswith("/start"): p = person.addPerson(chat_id, name) reply("Ciao " + p.getFirstName() + ", " + "benvenuta/o!") init_user(p, name, last_name, username) restart(p) # state = -1 or -2 tell_masters("New user: "******"Premi su /start se vuoi iniziare. " "Se hai qualche domanda o suggerimento non esitare di contattarmi cliccando su @kercos" ) else: # known user person.updateUsername(p, username) if text.startswith("/start"): reply("Ciao " + p.getFirstName() + ", " + "ben ritrovata/o!") init_user(p, name, last_name, username) restart(p) # state = -1 or -2 elif text == '/state': if p.state in STATES: reply("You are in state " + str(p.state) + ": " + STATES[p.state]) else: reply("You are in state " + str(p.state)) elif WORK_IN_PROGRESS and not p.isAdmin(): reply(UNDER_CONSTRUCTION + " Il sistema è in aggiornamento, riprova più tardi.") elif text.startswith('/rec_'): send_voiceLocationTranslationFromCommand(p, text, userInfo=p.isAdmin()) elif text.startswith('/sendText') and p.isAdmin(): dealWithsendTextCommand(p, text, markdown=False) elif p.state == -1: # INITIAL STATE if text in ['/help', BOTTONE_INFO]: redirectToState(p, 8) elif text == BOTTONE_REGISTRA: if p.location: dealWithPlaceAndMicInstructions(p) else: reply( "Questa è la tua prima registrazione: " "è necessario che tu inserisca il luogo del dialetto che vuoi registrare.\n" + ISTRUZIONI_POSIZIONE, kb=[[BOTTONE_ANNULLA]]) person.setState(p, -2) elif text == BOTTONE_ASCOLTA: goToAscolta(p) # state 30 elif p.isAdmin(): if text == BOTTONE_ADMIN: redirectToState(p, 9) elif text == '/test': reply('test') #reply(geoUtils.getLocationTest()) #taskqueue.add(url='/worker', params={'key': key}) #geoUtils.test_Google_Map_Api() elif text == '/infoCounts': c = person.getPeopleCount() reply("Number of users: " + str(c)) elif text == '/restartUsers': text = "Nuova interfaccia e nuove funzionalità :)\n" \ "Ora puoi inserire le località digitando il nome del posto (e.g, Perugia).\n" \ "Inoltre puoi cercare registrazioni in prossimità di un luogo.\n" \ "Buon ascolto e buona registrazione!" deferred.defer(restartAllUsers, text) #'New interface :)') #deferred.defer(restartTest, text) #'New interface :)') logging.debug('restarted users') elif text == '/importVivaldi': #logging.debug('nothing') recording.importVivaldi() elif text == '/countVivaldi': c = recording.countVivaldi() reply('Vivaldi recs: ' + str(c)) elif text == '/deleteVivaldi': recording.deleteVivaldi() reply('Deleted Vivaldi recs.') elif text == '/remFormatVoice': c = recording.removeFormatVoice() reply("removed rec format voice: " + str(c)) elif text == '/stats': msg = recording.getRecodingsStats() send_message(p.chat_id, msg, markdown=False) msg = "People count: {}".format( person.getPeopleCount()) send_message(p.chat_id, msg, markdown=False) elif text.startswith('/echo ') and len(text) > 6: msg = text[6:] reply(msg) elif text.startswith('/broadcast ') and len(text) > 11: msg = text[11:] deferred.defer(broadcast, p.chat_id, msg, restart_user=False) elif text.startswith( '/restartBroadcast ') and len(text) > 18: msg = text[18:] deferred.defer(broadcast, p.chat_id, msg, restart_user=True) elif text.startswith('/self ') and len(text) > 6: msg = text[6:] reply(msg) elif text == '/lastContributors': count, namesString, recCommandsString = getLastContibutors( 300) msg = "Contributors: " + str( count) + "\nNames: " + namesString reply(msg) elif text == '/testMonthlyMessage': msg = getMonthlyMessage() reply(msg) else: reply('Scusa, capisco solo /help /start ' 'e altri comandi segreti...') #setLanguage(d.language) else: reply( "Scusa non capisco quello che hai detto.\n" "Usa i pulsanti sotto o premi {} per avere informazioni." .format(BOTTONE_INFO)) elif p.state == -2: # POSIZIONE if text == BOTTONE_ANNULLA: restart(p, "Operazione annullata.") elif location != None: logging.debug('User sending location: {}, {}'.format( location['latitude'], location['longitude'])) luogo = geoUtils.getComuneProvinciaFromCoordinates( location['latitude'], location['longitude']) logging.debug('Detected luogo: {}'.format(luogo)) if luogo: person.setLocation(p, location['latitude'], location['longitude']) dealWithPlaceAndMicInstructions(p) else: reply( "Non conosco la località inserita, prova ad essere più precisa/o.\n" + ISTRUZIONI_POSIZIONE, kb=[[BOTTONE_INVIA_LOCATION], [BOTTONE_ANNULLA]]) logging.debug( 'Problem finding comune and provincia from coordinates {} {}' .format(location['latitude'], location['longitude'])) #state 20 elif text.startswith('('): text_split = text[1:-1].split(",") latitude = float(text_split[0]) longitude = float(text_split[1]) person.setLocation(p, latitude, longitude) send_location(p.chat_id, latitude, longitude) dealWithPlaceAndMicInstructions(p) #state 20 else: place = geoUtils.getLocationFromName(text) if place: person.setLocation(p, place.latitude, place.longitude) dealWithPlaceAndMicInstructions(p) #state 20 else: reply( "Non conosco la località inserita, prova ad essere più precisa/o.\n" + ISTRUZIONI_POSIZIONE, kb=[[BOTTONE_INVIA_LOCATION], [BOTTONE_ANNULLA]]) elif p.state == 20: # REGISTRA if text == BOTTONE_INDIETRO: restart(p, "Operazione annullata.") # state = -1 elif text == BOTTONE_CAMBIA_LUOGO: reply("Ok, cambiamo il luogo.\n" + ISTRUZIONI_POSIZIONE, kb=[[BOTTONE_INVIA_LOCATION], [BOTTONE_ANNULLA]]) person.setState(p, -2) # state -2 elif voice != None: reply( "Bene! 😉\n" "Ora riascolta la registrazione e conferma su ✅ OK " "se la registrazione è ben riuscita o premi su 🎙 REGISTRA DI NUOVO per" "effettuare un'altra registrazione.", kb=[['✅ OK'], ['🎙 REGISTRA DI NUOVO'], [BOTTONE_ANNULLA]]) file_id = voice['file_id'] #send_voice(p.chat_id, file_id) rec = recording.addRecording(p, file_id) person.setLastRecording(p, rec) person.setState(p, 21) else: reply( FROWNING_FACE + " Scusa non capisco quello che hai detto, devi inserire la registrazione tenendo premuto il microfono." ) elif p.state == 21: # CONFIRM RECORDING if text == BOTTONE_ANNULLA: person.removeLastRecording(p) restart(p, "Operazione annullata.") # state = -1 elif text == '✅ OK': msg = utility.unindent(''' Riteniamo utile avere una traduzione in italiano delle registrazione \ in modo da essere comprensibili da tutti gli utenti.\n *Scrivi qua sotto* la traduzione della registrazione \ (in aggiunta puoi inserire la trascrizione in dialetto e il significato in caso si tratti di un proverbio) ''') reply(msg, kb=[['Salta Traduzione']]) person.setState(p, 22) elif text == '🎙 REGISTRA DI NUOVO': person.removeLastRecording(p) reply(MIC_INSTRUCTIONS, kb=[[BOTTONE_CAMBIA_LUOGO], [BOTTONE_ANNULLA]]) person.setState(p, 20) else: reply( FROWNING_FACE + "Scusa non capisco quello che hai detto, premi *OK* per confermare la registrazione." ) elif p.state == 22: # CHECK IF AVAILABLE FOR TRANSLATION if text == 'Salta Traduzione': msg = "👍😀 Grazie per il tuo contributo!\n" \ "La registrazione è in attesa di approvazione, riceverai un messaggio a breve." reply(msg) sendNewRecordingNotice(p) restart(p) elif text == '': msg = "Input non valido. *Scrivi* qua sotto la traduzione in italiano della registrazione" reply(msg, kb=[['Salta Traduzione']]) return else: recording.addTranslation(p.last_recording_file_id, text) msg = "👍😀 Grazie per il tuo contributo!\n" \ "La registrazione è in attesa di approvazione, riceverai un messaggio a breve." reply(msg) sendNewRecordingNotice(p) restart(p) elif p.state == 30: if text == BOTTONE_INDIETRO: restart(p) # state = -1 elif text == BOTTONE_INDOVINA_LUOGO: dealWithRandomRecording(p) # state 31 elif text == BOTTONE_CERCA_LUOGO: reply(ISTRUZIONI_POSIZIONE_SEARCH, kb=[[BOTTONE_INDIETRO]]) person.setState(p, 32) # state 32 elif text == BOTTONE_RECENTI: getRecentRecordings(p) person.setState(p, 33) # state 33 elif text == BOTTONE_TUTTE: getAllRecordings(p) person.setState(p, 33) # state 33 else: msg = "Input non valido. Usa i pulsanti qua sotto." reply(msg) return elif p.state == 31: # ASCOLTA - INDOVINA LUOGO if text in [BOTTONE_INDIETRO, BOTTONE_ANNULLA]: restart(p) # state = -1 elif text == "ASCOLTA NUOVA REGISTRAZIONE": dealWithRandomRecording(p) # state 31 elif location != None: dealWithGuessedLocation(p, location) else: place = geoUtils.getLocationFromName(text) if place: guessed_loc = { 'latitude': place.latitude, 'longitude': place.longitude } dealWithGuessedLocation(p, guessed_loc) else: reply( "Non conosco la località inserita, prova ad essere più precisa/o.\n" + ISTRUZIONI_POSIZIONE_GUESS, kb=[[BOTTONE_ANNULLA]]) elif p.state == 32: #ASCOLTA - RICERCA LUOGO sendWaitingAction(p.chat_id) if location != None: dealWithFindClosestRecording(p, location) elif text == BOTTONE_INDIETRO: restart(p) else: place = geoUtils.getLocationFromName(text) if place: loc = { 'latitude': place.latitude, 'longitude': place.longitude } dealWithFindClosestRecording(p, loc) else: reply( "Non conosco la località inserita, prova ad essere più precisa/o.\n" + ISTRUZIONI_POSIZIONE_SEARCH, kb=[[BOTTONE_INDIETRO]]) elif p.state == 33: # REGISTRAZIONI RECENTI if text == BOTTONE_INDIETRO: goToAscolta(p) else: reply(FROWNING_FACE + "Scusa non capisco quello che hai detto.") else: logging.debug("Sending {0} to state {1}".format( p.getFirstName(), str(p.state))) repeatState(p, input=text)