# https://github.com/Treora/locator
# Made with love and impatience by bwb & treora.


import random
import wifi
import network
import time
import ugfx
import appglue
import badge
import usocket

channel = '#sha2017-locationspam'
welcome_message = "%s:" % channel
messages = ['','','','','','','','']
# from https://radius.sha2017.org/probe/bssid_list
bssid2name={b'\x18\x64\x72\x81\xe8\x50':'Radiostudio', b'\x18\x64\x72\x81\xe8\x51':'Radiostudio',
b'\x18\x64\x72\x81\xe8\x52':'Radiostudio', b'\x18\x64\x72\x81\xe8\x53':'Radiostudio',
b'\x18\x64\x72\x81\xe8\x40':'Radiostudio', b'\x18\x64\x72\x81\xe8\x41':'Radiostudio',
b'\x18\x64\x72\x81\xe8\x42':'Radiostudio', b'\x18\x64\x72\x81\xe8\x43':'Radiostudio',
b'\x18\x64\x72\x9b\xf4\x70':'Badge bar', b'\x18\x64\x72\x9b\xf4\x71':'Badge bar',
b'\x18\x64\x72\x9b\xf4\x72':'Badge bar', b'\x18\x64\x72\x9b\xf4\x73':'Badge bar',
b'\x18\x64\x72\x9b\xf4\x60':'Badge bar', b'\x18\x64\x72\x9b\xf4\x61':'Badge bar',
b'\x18\x64\x72\x9b\xf4\x62':'Badge bar', b'\x18\x64\x72\x9b\xf4\x63':'Badge bar',
b'\x24\xde\xc6\xcb\xa1\x18':'Security', b'\x24\xde\xc6\xcb\xa1\x19':'Security',
b'\x24\xde\xc6\xcb\xa1\x1a':'Security', b'\x24\xde\xc6\xcb\xa1\x1b':'Security',
b'\x24\xde\xc6\xcb\xa1\x10':'Security', b'\x24\xde\xc6\xcb\xa1\x11':'Security',
b'\x24\xde\xc6\xcb\xa1\x12':'Security', b'\x24\xde\xc6\xcb\xa1\x13':'Security',
b'\x24\xde\xc6\xdd\x36\xf0':'field Hopper-1', b'\x24\xde\xc6\xdd\x36\xf1':'field Hopper-1',
b'\x24\xde\xc6\xdd\x36\xf2':'field Hopper-1', b'\x24\xde\xc6\xdd\x36\xf3':'field Hopper-1',
b'\x24\xde\xc6\xdd\x36\xe0':'field Hopper-1', b'\x24\xde\xc6\xdd\x36\xe1':'field Hopper-1',
b'\x24\xde\xc6\xdd\x36\xe2':'field Hopper-1', b'\x24\xde\xc6\xdd\x36\xe3':'field Hopper-1',
b'\x24\xde\xc6\xdf\x2a\x50':'field Hopper-2', b'\x24\xde\xc6\xdf\x2a\x51':'field Hopper-2',
b'\x24\xde\xc6\xdf\x2a\x52':'field Hopper-2', b'\x24\xde\xc6\xdf\x2a\x53':'field Hopper-2',
b'\x24\xde\xc6\xdf\x2a\x40':'field Hopper-2', b'\x24\xde\xc6\xdf\x2a\x41':'field Hopper-2',
b'\x24\xde\xc6\xdf\x2a\x42':'field Hopper-2', b'\x24\xde\xc6\xdf\x2a\x43':'field Hopper-2',
b'\x24\xde\xc6\xdf\x64\x90':'street Uplink-2', b'\x24\xde\xc6\xdf\x64\x91':'street Uplink-2',
b'\x24\xde\xc6\xdf\x64\x92':'street Uplink-2', b'\x24\xde\xc6\xdf\x64\x93':'street Uplink-2',
b'\x24\xde\xc6\xdf\x64\x80':'street Uplink-2', b'\x24\xde\xc6\xdf\x64\x81':'street Uplink-2',
b'\x24\xde\xc6\xdf\x64\x82':'street Uplink-2', b'\x24\xde\xc6\xdf\x64\x83':'street Uplink-2',
b'\x24\xde\xc6\xe0\x4b\xf0':'field Flowers-1', b'\x24\xde\xc6\xe0\x4b\xf1':'field Flowers-1',
b'\x24\xde\xc6\xe0\x4b\xf2':'field Flowers-1', b'\x24\xde\xc6\xe0\x4b\xf3':'field Flowers-1',
b'\x24\xde\xc6\xe0\x4b\xe0':'field Flowers-1', b'\x24\xde\xc6\xe0\x4b\xe1':'field Flowers-1',
b'\x24\xde\xc6\xe0\x4b\xe2':'field Flowers-1', b'\x24\xde\xc6\xe0\x4b\xe3':'field Flowers-1',
b'\x24\xde\xc6\x0f\x4b\x30':'POC', b'\x24\xde\xc6\x0f\x4b\x31':'POC',
b'\x24\xde\xc6\x0f\x4b\x32':'POC', b'\x24\xde\xc6\x0f\x4b\x33':'POC',
b'\x24\xde\xc6\x0f\x4b\x20':'POC', b'\x24\xde\xc6\x0f\x4b\x21':'POC',
b'\x24\xde\xc6\x0f\x4b\x23':'POC', b'\x24\xde\xc6\x0f\x4b\x24':'POC',
b'\x24\xde\xc6\x0f\x50\x90':'field Alexander-2', b'\x24\xde\xc6\x0f\x50\x91':'field Alexander-2',
b'\x24\xde\xc6\x0f\x50\x92':'field Alexander-2', b'\x24\xde\xc6\x0f\x50\x93':'field Alexander-2',
b'\x24\xde\xc6\x0f\x50\x80':'field Alexander-2', b'\x24\xde\xc6\x0f\x50\x81':'field Alexander-2',
b'\x24\xde\xc6\x0f\x50\x82':'field Alexander-2', b'\x24\xde\xc6\x0f\x50\x83':'field Alexander-2',
b'\x34\xfc\xb9\x19\x69\x50':'workshop Tau', b'\x34\xfc\xb9\x19\x69\x51':'workshop Tau',
b'\x34\xfc\xb9\x19\x69\x52':'workshop Tau', b'\x34\xfc\xb9\x19\x69\x53':'workshop Tau',
b'\x40\xe3\xd6\xb7\x6a\x90':'Pancake Village', b'\x40\xe3\xd6\xb7\x6a\x91':'Pancake Village',
b'\x40\xe3\xd6\xb7\x6a\x92':'Pancake Village', b'\x40\xe3\xd6\xb7\x6a\x93':'Pancake Village',
b'\x40\xe3\xd6\xb7\x6a\x80':'Pancake Village', b'\x40\xe3\xd6\xb7\x6a\x81':'Pancake Village',
b'\x40\xe3\xd6\xb7\x6a\x82':'Pancake Village', b'\x40\xe3\xd6\xb7\x6a\x83':'Pancake Village',
b'\x40\xe3\xd6\x24\x0f\xb0':'Parking', b'\x40\xe3\xd6\x24\x0f\xb1':'Parking',
b'\x40\xe3\xd6\x24\x0f\xb2':'Parking', b'\x40\xe3\xd6\x24\x0f\xb3':'Parking',
b'\x40\xe3\xd6\x24\x0f\xa0':'Parking', b'\x40\xe3\xd6\x24\x0f\xa1':'Parking',
b'\x40\xe3\xd6\x24\x0f\xa2':'Parking', b'\x40\xe3\xd6\x24\x0f\xa3':'Parking',
b'\x6c\xf3\x7f\xa5\xce\x00':'field Lamarr-5', b'\x6c\xf3\x7f\xa5\xce\x01':'field Lamarr-5',
b'\x6c\xf3\x7f\xa5\xce\x02':'field Lamarr-5', b'\x6c\xf3\x7f\xa5\xce\x03':'field Lamarr-5',
b'\x6c\xf3\x7f\xb2\x40\x90':'field Torvalds-4', b'\x6c\xf3\x7f\xb2\x40\x91':'field Torvalds-4',
b'\x6c\xf3\x7f\xb2\x40\x92':'field Torvalds-4', b'\x6c\xf3\x7f\xb2\x40\x93':'field Torvalds-4',
b'\x6c\xf3\x7f\xb2\x40\x80':'field Torvalds-4', b'\x6c\xf3\x7f\xb2\x40\x81':'field Torvalds-4',
b'\x6c\xf3\x7f\xb2\x40\x82':'field Torvalds-4', b'\x6c\xf3\x7f\xb2\x40\x83':'field Torvalds-4',
b'\x6c\xf3\x7f\xb8\x45\xf0':'field Liskov-2', b'\x6c\xf3\x7f\xb8\x45\xf1':'field Liskov-2',
b'\x6c\xf3\x7f\xb8\x45\xf2':'field Liskov-2', b'\x6c\xf3\x7f\xb8\x45\xf3':'field Liskov-2',
b'\x6c\xf3\x7f\xb8\x4b\x70':'field Lamarr-1', b'\x6c\xf3\x7f\xb8\x4b\x71':'field Lamarr-1',
b'\x6c\xf3\x7f\xb8\x4b\x72':'field Lamarr-1', b'\x6c\xf3\x7f\xb8\x4b\x73':'field Lamarr-1',
b'\x6c\xf3\x7f\x56\x1a\xd0':'field Olsen-3', b'\x6c\xf3\x7f\x56\x1a\xd1':'field Olsen-3',
b'\x6c\xf3\x7f\x56\x1a\xd2':'field Olsen-3', b'\x6c\xf3\x7f\x56\x1a\xd3':'field Olsen-3',
b'\x6c\xf3\x7f\x56\x1a\xc0':'field Olsen-3', b'\x6c\xf3\x7f\x56\x1a\xc1':'field Olsen-3',
b'\x6c\xf3\x7f\x56\x1a\xc2':'field Olsen-3', b'\x6c\xf3\x7f\x56\x1a\xc3':'field Olsen-3',
b'\x6c\xf3\x7f\x56\x1b\x90':'field Olsen-1', b'\x6c\xf3\x7f\x56\x1b\x91':'field Olsen-1',
b'\x6c\xf3\x7f\x56\x1b\x92':'field Olsen-1', b'\x6c\xf3\x7f\x56\x1b\x93':'field Olsen-1',
b'\x6c\xf3\x7f\x56\x1b\x80':'field Olsen-1', b'\x6c\xf3\x7f\x56\x1b\x81':'field Olsen-1',
b'\x6c\xf3\x7f\x56\x1b\x82':'field Olsen-1', b'\x6c\xf3\x7f\x56\x1b\x83':'field Olsen-1',
b'\x6c\xf3\x7f\x56\x2f\x50':'field Turing-1', b'\x6c\xf3\x7f\x56\x2f\x51':'field Turing-1',
b'\x6c\xf3\x7f\x56\x2f\x52':'field Turing-1', b'\x6c\xf3\x7f\x56\x2f\x53':'field Turing-1',
b'\x6c\xf3\x7f\x56\x2f\x40':'field Turing-1', b'\x6c\xf3\x7f\x56\x2f\x41':'field Turing-1',
b'\x6c\xf3\x7f\x56\x2f\x42':'field Turing-1', b'\x6c\xf3\x7f\x56\x2f\x43':'field Turing-1',
b'\x6c\xf3\x7f\x5f\xd7\x90':'field Turing-2', b'\x6c\xf3\x7f\x5f\xd7\x91':'field Turing-2',
b'\x6c\xf3\x7f\x5f\xd7\x92':'field Turing-2', b'\x6c\xf3\x7f\x5f\xd7\x93':'field Turing-2',
b'\x6c\xf3\x7f\x5f\xd7\x80':'field Turing-2', b'\x6c\xf3\x7f\x5f\xd7\x81':'field Turing-2',
b'\x6c\xf3\x7f\x5f\xd7\x82':'field Turing-2', b'\x6c\xf3\x7f\x5f\xd7\x83':'field Turing-2',
b'\x6c\xf3\x7f\x5f\xeb\xf0':'field Wilson', b'\x6c\xf3\x7f\x5f\xeb\xf1':'field Wilson',
b'\x6c\xf3\x7f\x5f\xeb\xf2':'field Wilson', b'\x6c\xf3\x7f\x5f\xeb\xf3':'field Wilson',
b'\x6c\xf3\x7f\x5f\xeb\xe0':'field Wilson', b'\x6c\xf3\x7f\x5f\xeb\xe1':'field Wilson',
b'\x6c\xf3\x7f\x5f\xeb\xe2':'field Wilson', b'\x6c\xf3\x7f\x5f\xeb\xe3':'field Wilson',
b'\x84\xd4\x7e\xac\xdc\x90':'Orga', b'\x84\xd4\x7e\xac\xdc\x91':'Orga',
b'\x84\xd4\x7e\xac\xdc\x92':'Orga', b'\x84\xd4\x7e\xac\xdc\x93':'Orga',
b'\x84\xd4\x7e\xac\xdc\x80':'Orga', b'\x84\xd4\x7e\xac\xdc\x81':'Orga',
b'\x84\xd4\x7e\xac\xdc\x82':'Orga', b'\x84\xd4\x7e\xac\xdc\x83':'Orga',
b'\x94\xb4\x0f\x32\x0b\xf0':'zuse', b'\x94\xb4\x0f\x32\x0b\xf1':'zuse',
b'\x94\xb4\x0f\x32\x0b\xf2':'zuse', b'\x94\xb4\x0f\x32\x0b\xf3':'zuse',
b'\x94\xb4\x0f\x32\x0b\xe0':'zuse', b'\x94\xb4\x0f\x32\x0b\xe1':'zuse',
b'\x94\xb4\x0f\x32\x0b\xe2':'zuse', b'\x94\xb4\x0f\x32\x0b\xe3':'zuse',
b'\x94\xb4\x0f\x53\x55\x90':'AV', b'\x94\xb4\x0f\x53\x55\x91':'AV',
b'\x94\xb4\x0f\x53\x55\x92':'AV', b'\x94\xb4\x0f\x53\x55\x93':'AV',
b'\x94\xb4\x0f\x53\x55\x80':'AV', b'\x94\xb4\x0f\x53\x55\x81':'AV',
b'\x94\xb4\x0f\x53\x55\x82':'AV', b'\x94\xb4\x0f\x53\x55\x83':'AV',
b'\x9c\x1c\x12\xb0\x25\x90':'street Uplink-1', b'\x9c\x1c\x12\xb0\x25\x91':'street Uplink-1',
b'\x9c\x1c\x12\xb0\x25\x92':'street Uplink-1', b'\x9c\x1c\x12\xb0\x25\x93':'street Uplink-1',
b'\x9c\x1c\x12\xb0\x25\x80':'street Uplink-1', b'\x9c\x1c\x12\xb0\x25\x81':'street Uplink-1',
b'\x9c\x1c\x12\xb0\x25\x82':'street Uplink-1', b'\x9c\x1c\x12\xb0\x25\x83':'street Uplink-1',
b'\xac\xa3\x1e\x81\x06\x70':'L0-TEMP', b'\xac\xa3\x1e\x81\x06\x71':'L0-TEMP',
b'\xac\xa3\x1e\x81\x06\x72':'L0-TEMP', b'\xac\xa3\x1e\x81\x06\x73':'L0-TEMP',
b'\xac\xa3\x1e\x81\x06\x60':'L0-TEMP', b'\xac\xa3\x1e\x81\x06\x61':'L0-TEMP',
b'\xac\xa3\x1e\x81\x06\x62':'L0-TEMP', b'\xac\xa3\x1e\x81\x06\x63':'L0-TEMP',
b'\xac\xa3\x1e\x81\x14\x80':'southtrunk-1', b'\xac\xa3\x1e\x81\x14\x81':'southtrunk-1',
b'\xac\xa3\x1e\x81\x14\x82':'southtrunk-1', b'\xac\xa3\x1e\x81\x14\x83':'southtrunk-1',
b'\xac\xa3\x1e\x83\x88\x10':'Entrance-1', b'\xac\xa3\x1e\x83\x88\x11':'Entrance-1',
b'\xac\xa3\x1e\x83\x88\x12':'Entrance-1', b'\xac\xa3\x1e\x83\x88\x13':'Entrance-1',
b'\xac\xa3\x1e\x83\x88\x00':'Entrance-1', b'\xac\xa3\x1e\x83\x88\x01':'Entrance-1',
b'\xac\xa3\x1e\x83\x88\x02':'Entrance-1', b'\xac\xa3\x1e\x83\x88\x03':'Entrance-1',
b'\xac\xa3\x1e\x87\x4e\x00':'Lamarr-Forest', b'\xac\xa3\x1e\x87\x4e\x01':'Lamarr-Forest',
b'\xac\xa3\x1e\x87\x4e\x02':'Lamarr-Forest', b'\xac\xa3\x1e\x87\x4e\x03':'Lamarr-Forest',
b'\xac\xa3\x1e\xd9\x5e\xd0':'Silent Lounge-a', b'\xac\xa3\x1e\xd9\x5e\xd1':'Silent Lounge-a',
b'\xac\xa3\x1e\xd9\x5e\xd2':'Silent Lounge-a', b'\xac\xa3\x1e\xd9\x5e\xd3':'Silent Lounge-a',
b'\xac\xa3\x1e\xd9\x5e\xc0':'Silent Lounge-a', b'\xac\xa3\x1e\xd9\x5e\xc1':'Silent Lounge-a',
b'\xac\xa3\x1e\xd9\x5e\xc2':'Silent Lounge-a', b'\xac\xa3\x1e\xd9\x5e\xc3':'Silent Lounge-a',
b'\xac\xa3\x1e\xde\xaa\xf0':'Silent Lounge-b', b'\xac\xa3\x1e\xde\xaa\xf1':'Silent Lounge-b',
b'\xac\xa3\x1e\xde\xaa\xf2':'Silent Lounge-b', b'\xac\xa3\x1e\xde\xaa\xf3':'Silent Lounge-b',
b'\xac\xa3\x1e\xde\xaa\xe0':'Silent Lounge-b', b'\xac\xa3\x1e\xde\xaa\xe1':'Silent Lounge-b',
b'\xac\xa3\x1e\xde\xaa\xe2':'Silent Lounge-b', b'\xac\xa3\x1e\xde\xaa\xe3':'Silent Lounge-b',
b'\xd8\xc7\xc8\x8d\x96\xb0':'field Rhodes-2', b'\xd8\xc7\xc8\x8d\x96\xb1':'field Rhodes-2',
b'\xd8\xc7\xc8\x8d\x96\xb2':'field Rhodes-2', b'\xd8\xc7\xc8\x8d\x96\xb3':'field Rhodes-2',
b'\xd8\xc7\xc8\x4a\xe7\x70':'field Alexander-1', b'\xd8\xc7\xc8\x4a\xe7\x71':'field Alexander-1',
b'\xd8\xc7\xc8\x4a\xe7\x72':'field Alexander-1', b'\xd8\xc7\xc8\x4a\xe7\x73':'field Alexander-1',
b'\xd8\xc7\xc8\x4a\xe7\x60':'field Alexander-1', b'\xd8\xc7\xc8\x4a\xe7\x61':'field Alexander-1',
b'\xd8\xc7\xc8\x4a\xe7\x62':'field Alexander-1', b'\xd8\xc7\xc8\x4a\xe7\x63':'field Alexander-1',
b'\xd8\xc7\xc8\x4d\x78\x10':'field Snowden-1', b'\xd8\xc7\xc8\x4d\x78\x11':'field Snowden-1',
b'\xd8\xc7\xc8\x4d\x78\x12':'field Snowden-1', b'\xd8\xc7\xc8\x4d\x78\x13':'field Snowden-1',
b'\xd8\xc7\xc8\x4d\x78\x00':'field Snowden-1', b'\xd8\xc7\xc8\x4d\x78\x01':'field Snowden-1',
b'\xd8\xc7\xc8\x4d\x78\x02':'field Snowden-1', b'\xd8\xc7\xc8\x4d\x78\x03':'field Snowden-1',
b'\xd8\xc7\xc8\x4d\xd0\xd0':'field Snowden-3', b'\xd8\xc7\xc8\x4d\xd0\xd1':'field Snowden-3',
b'\xd8\xc7\xc8\x4d\xd0\xd2':'field Snowden-3', b'\xd8\xc7\xc8\x4d\xd0\xd3':'field Snowden-3',
b'\xd8\xc7\xc8\x4d\xd0\xc0':'field Snowden-3', b'\xd8\xc7\xc8\x4d\xd0\xc1':'field Snowden-3',
b'\xd8\xc7\xc8\x4d\xd0\xc2':'field Snowden-3', b'\xd8\xc7\xc8\x4d\xd0\xc3':'field Snowden-3',
b'\xf0\x5c\x19\x22\x86\xb0':'room No-d', b'\xf0\x5c\x19\x22\x86\xb1':'room No-d',
b'\xf0\x5c\x19\x22\x86\xb2':'room No-d', b'\xf0\x5c\x19\x22\x86\xb3':'room No-d',
b'\xf0\x5c\x19\x22\x86\xa0':'room No-d', b'\xf0\x5c\x19\x22\x86\xa1':'room No-d',
b'\xf0\x5c\x19\x22\x86\xa2':'room No-d', b'\xf0\x5c\x19\x22\x86\xa3':'room No-d',
b'\xf0\x5c\x19\x22\x8c\x90':'room Pa-e', b'\xf0\x5c\x19\x22\x8c\x91':'room Pa-e',
b'\xf0\x5c\x19\x22\x8c\x92':'room Pa-e', b'\xf0\x5c\x19\x22\x8c\x93':'room Pa-e',
b'\xf0\x5c\x19\x22\x8c\x80':'room Pa-e', b'\xf0\x5c\x19\x22\x8c\x81':'room Pa-e',
b'\xf0\x5c\x19\x22\x8c\x82':'room Pa-e', b'\xf0\x5c\x19\x22\x8c\x83':'room Pa-e',
b'\xf0\x5c\x19\x22\x91\x30':'room Pa-b', b'\xf0\x5c\x19\x22\x91\x31':'room Pa-b',
b'\xf0\x5c\x19\x22\x91\x32':'room Pa-b', b'\xf0\x5c\x19\x22\x91\x33':'room Pa-b',
b'\xf0\x5c\x19\x22\x91\x20':'room Pa-b', b'\xf0\x5c\x19\x22\x91\x21':'room Pa-b',
b'\xf0\x5c\x19\x22\x91\x22':'room Pa-b', b'\xf0\x5c\x19\x22\x91\x23':'room Pa-b',
b'\xf0\x5c\x19\x22\xb2\x30':'room Pa-d', b'\xf0\x5c\x19\x22\xb2\x31':'room Pa-d',
b'\xf0\x5c\x19\x22\xb2\x32':'room Pa-d', b'\xf0\x5c\x19\x22\xb2\x33':'room Pa-d',
b'\xf0\x5c\x19\x22\xb2\x20':'room Pa-d', b'\xf0\x5c\x19\x22\xb2\x21':'room Pa-d',
b'\xf0\x5c\x19\x22\xb2\x22':'room Pa-d', b'\xf0\x5c\x19\x22\xb2\x23':'room Pa-d',
b'\xf0\x5c\x19\x22\xb5\x50':'room No-f', b'\xf0\x5c\x19\x22\xb5\x51':'room No-f',
b'\xf0\x5c\x19\x22\xb5\x52':'room No-f', b'\xf0\x5c\x19\x22\xb5\x53':'room No-f',
b'\xf0\x5c\x19\x22\xb5\x40':'room No-f', b'\xf0\x5c\x19\x22\xb5\x41':'room No-f',
b'\xf0\x5c\x19\x22\xb5\x42':'room No-f', b'\xf0\x5c\x19\x22\xb5\x43':'room No-f',
b'\xf0\x5c\x19\x22\xb7\xf0':'room Pa-f', b'\xf0\x5c\x19\x22\xb7\xf1':'room Pa-f',
b'\xf0\x5c\x19\x22\xb7\xf2':'room Pa-f', b'\xf0\x5c\x19\x22\xb7\xf3':'room Pa-f',
b'\xf0\x5c\x19\x22\xb7\xe0':'room Pa-f', b'\xf0\x5c\x19\x22\xb7\xe1':'room Pa-f',
b'\xf0\x5c\x19\x22\xb7\xe2':'room Pa-f', b'\xf0\x5c\x19\x22\xb7\xe3':'room Pa-f',
b'\xf0\x5c\x19\x22\xb8\xb0':'room Re-c', b'\xf0\x5c\x19\x22\xb8\xb1':'room Re-c',
b'\xf0\x5c\x19\x22\xb8\xb2':'room Re-c', b'\xf0\x5c\x19\x22\xb8\xb3':'room Re-c',
b'\xf0\x5c\x19\x22\xb8\xa0':'room Re-c', b'\xf0\x5c\x19\x22\xb8\xa1':'room Re-c',
b'\xf0\x5c\x19\x22\xb8\xa2':'room Re-c', b'\xf0\x5c\x19\x22\xb8\xa3':'room Re-c',
b'\xf0\x5c\x19\x23\x75\xd0':'room No-a', b'\xf0\x5c\x19\x23\x75\xd1':'room No-a',
b'\xf0\x5c\x19\x23\x75\xd2':'room No-a', b'\xf0\x5c\x19\x23\x75\xd3':'room No-a',
b'\xf0\x5c\x19\x23\x75\xc0':'room No-a', b'\xf0\x5c\x19\x23\x75\xc1':'room No-a',
b'\xf0\x5c\x19\x23\x75\xc2':'room No-a', b'\xf0\x5c\x19\x23\x75\xc3':'room No-a'}

def wifi2name():
	wlan = network.WLAN(network.STA_IF)
	wlan.active("up")
	# Each result is a tuple: (ssid, bssid, channel, RSSI, authmode, hidden)
	results = wlan.scan()
	# only check BSSids on the list (since there are a lot of rogue APs)
	filtered = [entry for entry in results if entry[1] in bssid2name]

	strongest_ap = max(filtered, key=lambda ap: ap[3])
	bssid = strongest_ap[1]
	# ssid = strongest_ap[0]
	# macaddress = ":".join(hex(x)[2:] for x in bssid)
	location = bssid2name.get(bssid)
	if (location):
		return location
	return 'no idea!'

def init_screen():
	ugfx.clear(ugfx.WHITE)
	ugfx.string(0, 0, welcome_message, 'Roboto_Black22', ugfx.BLACK)

ugfx.init()
ugfx.input_init()
wifi.init()
init_screen()
#FIXME: Add small info with: A = location push, B = back, X = Set Your group + Filter group (all in one)
ugfx.flush()

def go_home(pushed):
	if pushed:
		appglue.home()
ugfx.input_attach(ugfx.BTN_B, go_home)

# wait for wifi
while not wifi.sta_if.isconnected():
	time.sleep(0.1)

def relocate(pushed):
	if pushed:
		global location
		global messages
		location = wifi2name()
		ircsock.send(bytes("PRIVMSG %s :%s\r\n" % (channel, location), "UTF-8"))
		messages = messages[1:] + [constructMsg(bytes(nick, "UTF-8"), bytes(location, "UTF-8"))]
		update_screen()
ugfx.input_attach(ugfx.BTN_A, relocate)

location = wifi2name()
lastlocation = location
lastcheck = time.time()

nick = badge.nvs_get_str("owner", "name", 'anonymous')
random.seed(time.time()) #whatever!
nickbadge = nick + '_badge_' + str(random.randint(1,9999))

ircsock = usocket.socket()
ircsock.connect(("chat.freenode.net", 6667))
ircsock.settimeout(1)

def constructMsg(author, location):
	t = time.localtime()
	return  bytes("%02d:%02d:%02d " % (t[3], t[4], t[5]), "UTF-8") + author + b': ' + location

def update_screen():
	init_screen()
	for i, m in enumerate(messages):
		ugfx.string(0,24+i*12,m,"Roboto_Regular12",ugfx.BLACK)
	ugfx.flush()

ircsock.send(bytes("NICK %s\r\n" % nickbadge, "UTF-8"))
ircsock.send(bytes("USER %s 0 * :%s\r\n" % (nickbadge, nick), "UTF-8"))
ircsock.send(bytes("JOIN %s\r\n" % channel, "UTF-8"));
ircsock.send(bytes("PRIVMSG %s :%s\r\n" % (channel, location), "UTF-8"))
messages = messages[1:] + [constructMsg(bytes(nick, "UTF-8"), bytes(location, "UTF-8"))]
update_screen()

while 1:
	if (time.time() - lastcheck > 60):
		lastcheck = time.time()
		location = wifi2name()
		if (location != lastlocation):
			ircsock.send(bytes("PRIVMSG %s :%s\r\n" % (channel, location), "UTF-8"))
			lastlocation = location
			messages = messages[1:] + [constructMsg(bytes(nick, "UTF-8"), bytes(location, "UTF-8"))]
			update_screen()

	line = ''
	try:
		line = ircsock.readline().rstrip()
	except Exception as e:
		#print("timeout")
		continue
	parts = line.split()

	if parts:
		if(parts[0] == b"PING"):
			ircsock.send(bytes("PONG %s\r\n" % line[1], "UTF-8"))
		if(parts[1] == b"PRIVMSG"):
			msg = b' '.join(parts[3:]).lstrip(b':')
			rnick = parts[0].split(b'!')[0].split(b'_badge')[0].lstrip(b':')
			messages = messages[1:] + [constructMsg(rnick, msg)]
			update_screen()
		print(line)

# networking docs:
# https://github.com/micropython/micropython-esp32/blob/046d15f074398cc2968fc66ae2fd25dc31100109/docs/library/network.rst
# https://github.com/micropython/micropython-esp32/blob/ec9c2778867fbb4d0ef1ebf5ace6433b01589d05/docs/esp8266/tutorial/network_basics.rst