docs: def run(self):
          """
          Listen for controllers.
          """
          while True:
              data, sender = self.sock.recvfrom(1024)
              addr = sender[0]
              msg = data.decode('utf-8')
              if msg.startswith('/controller/'):
                  try:
                      uid = msg.split('/')[2]
                      if uid == 'new':
                          port = int(msg.split('/')[3])
                          self._new_controller(addr, port)
                      else:
                          cmd = msg.split('/')[3]
                          if cmd == 'ping':
                              port = msg.split('/')[3]
                              self._ping(uid, addr, port)
                          elif cmd == 'kthxbye':
                              self._del_controller(uid)
                          elif cmd == 'states':
                              states = msg.split('/')[4]
                              self._update_states(uid, states)
                          elif cmd == 'text':
                              # /controller/<uid>/text/<text>
                              text = msg[12 + len(uid) + 6:]
                              self._got_message(uid, text)
                  except IndexError or KeyError:
                      pass
              else:
                  pass
  
              # find unused controllers and delete them
              ctlrs = self.controllers.items()
              for uid, state in ctlrs:
                  if state[3] < time.time() - 60:
                      self.controllers.pop(uid)