예제 #1
0
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
예제 #2
0
    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)
예제 #3
0
    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
        )
예제 #4
0
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']
예제 #5
0
 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)
예제 #6
0
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)
    ])
예제 #7
0
 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)
예제 #8
0
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 []
예제 #9
0
# -*- 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" \
예제 #10
0
    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)