Toggle Navigation
Hatchery
Eggs
Winkekatze
winkekatze.py
Users
Badges
Login
Register
winkekatze.py
raw
Content
import ugfx import time import badge import wifi import mpr121 from hashlib import sha1 import system #import uos import ubinascii import network from umqtt.simple import MQTTClient wifi.connect() class WinkeKatze: # |\_/| # (. .) # =w= (\ # / ^ \// # (|| ||) # ,""_""_ . # |\_/| # (. .) # =w= # / ^ \\ # (|| ||)\\ # ,""_""_(/. def draw_cat(self,cat='up',footer="https://devlol.org - press A to wink all other cats"): i=2 if (cat == 'up'): drawcat = self.cat elif (cat == 'down'): drawcat = self.catdown ugfx.clear(ugfx.WHITE) for line in drawcat: i += 1 j=0 for char in line: j +=1 ugfx.string(8*j, 12*i,char, self.font, ugfx.BLACK) print (line) if footer: i +=1 ugfx.string(8,12*i,footer,self.font,ugfx.BLACK) if self.clients > 0: ugfx.string(0,12,("%d online now" % (self.clients)),self.font,ugfx.BLACK) if self.nick: ugfx.string(110,90,("%s winks" % (str(self.nick))),self.font,ugfx.BLACK) if self.nick1: ugfx.string(110,80,("%s winks" % (str(self.nick1))),self.font,ugfx.BLACK) if self.nick2: ugfx.string(110,70,("%s winks" % (str(self.nick2))),self.font,ugfx.BLACK) if self.nick3: ugfx.string(110,60,("%s winks" % (str(self.nick3))),self.font,ugfx.BLACK) if self.nick4: ugfx.string(110,50,("%s winks" % (str(self.nick4))),self.font,ugfx.BLACK) ugfx.string(90,10,self.owner,"PermanentMarker22",ugfx.BLACK) ugfx.string(0,0,str(self.motd),self.font,ugfx.BLACK) ugfx.flush() def new_wink(self,msg): self.nick4 = self.nick3 self.nick3 = self.nick2 self.nick2 = self.nick1 self.nick1 = self.nick self.nick = msg.decode("utf-8") def sub_cb(self,topic,msg): print ("received mqtt message topic: %s, payload: %s" % (topic,msg)) if topic.endswith('/nick'): if msg.decode("utf-8") == self.nick: pass else: print ("setting received nick to %s" % msg.decode("utf-8")) self.new_wink(msg) list = [] hash = ubinascii.hexlify(sha1(self.nick).digest()) for i in range(6): # reverse because of reverse() list.append(0) list.append(int(int(hash[i*6+4:i*6+6], 16)/7)) list.append(int(int(hash[i*6+2:i*6+4], 16)/7)) list.append(int(int(hash[i*6:i*6+2], 16)/7)) list.reverse() colors = bytes(list) self.wink(colors) if topic.endswith('/motd'): self.motd = msg.decode("utf-8") self.draw_cat() for i in range(2): badge.leds_send_data(bytes([0x50,0x00,0x00,0x00]*6)) time.sleep(0.1) badge.leds_send_data(bytes([0x00,0x00,0x00,0x00]*6)) time.sleep(0.1) if topic.endswith('/num_clients'): try: self.clients = int(msg.decode("utf-8")) except: pass self.draw_cat() def wink(self, colors): badge.leds_send_data(colors) for count in range(2): self.draw_cat(cat="down") badge.vibrator_activate(127) badge.leds_send_data(bytes([0x50,0x00,0x00,0x00]*6)) time.sleep(0.5) self.draw_cat() badge.leds_send_data(bytes([0x00,0x00,0x00,0x00]*6)) time.sleep(0.5) def btn_select(self,pressed): if pressed: print("Returning to homescreen") system.launcher() return 0 def btn_a(self,pressed): if pressed: print ("publish nick %s to topic %s/nick" % ( self.owner, self.topic)) self.c.publish(("%s/nick" % self.topic), self.owner) print ("publish WINK3 to topic %s" % ( self.topic)) self.c.publish(("%s" % self.topic), "WINK3") def btn_b(self,pressed): pass def btn_up(self,pressed): pass def btn_down(self,pressed): pass def btn_left(self,pressed): pass def btn_right(self,pressed): pass def btn_start(self,pressed): pass def __init__(self, font="roboto_regular12",server='mqtt.devlol.org',topic='devlol/h19/mainroom/winkekatze'): self.cat = [' |\_/| ', ' (. .) ', ' =w= (\ ', ' / ^ \// ', ' (|| ||) ', ' ,""_""_ .'] self.catdown =[' |\_/| ', ' (. .) ', ' =w= ', ' / ^ \\\\ ', ' (|| ||)\\', ' ,""_""_(/.'] self.font = font #self.clientname = 'SHA2017Badge' + str(ubinascii.hexlify(uos.urandom(5))) self.clientname = 'SHA2017Badge_cat' + ubinascii.hexlify(network.WLAN().config("mac")).decode("UTF-8") self.server = server self.topic = topic self.clients = 0 self.version = 44 self.nick = '' self.nick1 = '' self.nick2 = '' self.nick3 = '' self.nick4 = '' self.motd = 'Alle 5 Minuten verliebt sich ein Hacker ueber die WinkekatzenApp' badge.init() badge.leds_enable() #workaround for emulator try: self.owner = badge.nvs_get_str("owner","name","anonycat") except: self.owner ="anonycat" self.statustopic = ("%s/%s/%s" %(self.topic, 'clientstatus', self.owner)) ugfx.init() while not wifi.sta_if.isconnected(): time.sleep(1) print ("waiting for wifi") pass print ("connecting to mqtt server:%s clientname:%s" %(self.server,self.clientname)) self.c = MQTTClient(self.clientname,self.server) #,keepalive=60) # bug in umqtt, won't work self.c.set_callback(self.sub_cb) self.c.set_last_will(self.statustopic, 'OFFLINE',retain=True) self.c.connect() self.c.subscribe("%s/nick" % self.topic) self.c.subscribe("%s/motd" % self.topic) self.c.subscribe("%s/num_clients" % self.topic) self.c.publish(self.statustopic, str(self.version), retain=True) ugfx.clear(ugfx.BLACK) ugfx.flush ugfx.clear(ugfx.WHITE) ugfx.flush #ugfx.input_init() #ugfx.input_attach(ugfx.JOY_UP,lambda pressed: self.btn_up(pressed)) #ugfx.input_attach(ugfx.JOY_DOWN,lambda pressed: self.btn_down(pressed)) #ugfx.input_attach(ugfx.JOY_LEFT,lambda pressed: self.btn_left(pressed)) #ugfx.input_attach(ugfx.JOY_RIGHT,lambda pressed: self.btn_right(pressed)) #ugfx.input_attach(ugfx.BTN_SELECT,lambda pressed: self.btn_select(pressed)) #ugfx.input_attach(ugfx.BTN_START,lambda pressed: self.btn_start(pressed)) #ugfx.input_attach(ugfx.BTN_A,lambda pressed: self.btn_a(pressed)) #ugfx.input_attach(ugfx.BTN_B,lambda pressed: self.btn_b(pressed)) mpr121.attach(0, self.btn_a) mpr121.attach(1, self.btn_b) mpr121.attach(2, self.btn_start) mpr121.attach(3, self.btn_select) mpr121.attach(4, self.btn_down) mpr121.attach(5, self.btn_right) mpr121.attach(6, self.btn_up) mpr121.attach(7, self.btn_left) self.draw_cat() # last_status_update = time.time() # status_update_interval = 60 while True: time.sleep(0.5) self.c.check_msg() # if (time.time() > last_status_update + status_update_interval): # last_status_update = time.time() # self.c.publish(self.statustopic, str(self.version), retain=True) wk = WinkeKatze()