def picked(res): pickles = [int(p) for p in res.message.text.split(',')] rem = robot.get_from_memory('removables', []) table = robot.get_from_memory('box_list', {}) user = res.message.room username = str(res.message.user) if username not in rem: return item = rem[username] boxes = item['boxes'] expires = item['expires'] now = time.time() extended = [] for p in xrange(len(boxes)): is_picked = p in pickles has_expired = expires[p] < now b = boxes[p] if str(table[b].user) == username and not has_expired and is_picked: table[b].expires = time.time() + TICKET_LIFE_SPAN extended.append(b) else: table[b].free = True if extended: res.robot.send( user, "I'll keep {0} for you for another {1}".format( ','.join(extended), humanize_time(TICKET_LIFE_SPAN))) else: res.robot.send("I'm sorry but all your boxes have been freed already") del rem[username] robot.put_to_memory('box_list', table) robot.put_to_memory('removables', rem)
def still_in(res): rem = robot.get_from_memory('removables', []) user = res.message.room username = str(res.message.user) if username in rem: reply = res.message.text b = rem[username]['box'][0] usr = rem[username] table = robot.get_from_memory('box_list', {}) has_expired = usr['expires'][0] < time.time() del rem[username] if re.match(r'(y([eash]+)?)', reply) and str( table[b].user) == username and not has_expired: table[b].expires = time.time() + TICKET_LIFE_SPAN robot.send( user, "Ok I'll keep {0} for you for another {1}".format( b, humanize_time(TICKET_LIFE_SPAN))) elif re.match(r'(n([opeah]+)?)', reply): table[b].free = True robot.send( user, "OK I'll free up {} and let others know that they can use it". format(b)) else: robot.send(user, '{} has already been freed up'.format(b)) robot.put_to_memory('box_list', table) robot.put_to_memory('removables', rem)
def free_box(res): table = robot.get_from_memory('box_list', {}) box = res.message.text.split()[1] b = table.get(box, Box(box, None, None, None, None)) b.free = True table[box] = b robot.put_to_memory('box_list', table) robot.send(res.message.room, "{0} is now free to use!!".format(box))
def assign_boxes(boxes, user): mem = robot.get_from_memory('box_list') now = time.time() for b in boxes: box = mem.get(b, Box(b, user, now, None, now + TICKET_LIFE_SPAN)) box.user = user box.free = False box.taken = now box.expires = now + TICKET_LIFE_SPAN mem[b] = box robot.put_to_memory('box_list', mem)
def box_cleaner_notify_user(items): mem = robot.get_from_memory('removables', {}) for i in items: boxes = items[i]['box'] user = items[i]['user'] if len(boxes) == 1: rem_time = items[i]['expires'][0] box = boxes[0] msg = "Oowee looks like your box will be removed in {}".format( humanize_time(rem_time)) robot.send(user.id, msg, attachments=[{ 'text': "Are you still using {}? (y/n)".format(box), "fallback": "Are you still using {}? (y/n)".format(box) }], is_im=True) mem[user.name] = { 'box': [box], 'expires': [time.time() + rem_time] } else: msg = "Oowee the following boxes, which you're using, will automatically expire:\n" rem_times = items[i]['expires'] expires2 = [] now = time.time() for j, box in enumerate(boxes): msg += '({0}) {1} - {2}'.format(j, box, humanize_time(rem_times[j])) expires2.append(now + rem_times[j]) submsg = "Please enter the indices of the boxes which you're still using separated by commas (1,2,3...)" robot.send(user.id, msg, attachments=[{ 'text': submsg, "fallback": submsg }], is_im=True) mem[user.name] = {'box': boxes, 'expires': expires2} robot.put_to_memory('removables', mem)
def clean_up_boxes(func_call=False): if not func_call: Timer(REFRESH_RATE, clean_up_boxes).start() table = robot.get_from_memory("box_list", {}) notifiable_users = {} for b in table: box = table.get(b) if box.free: continue now = time.time() if robot.ticket_is_closed(box.ticket) or box.expires <= now: table[b].free = True elif (box.expires - TICKET_NOTIFY_TIME) <= now: notifiable_users[box.user.id] = { 'box': [b], 'expires': [box.expires - now], 'user': box.user } if notifiable_users: box_cleaner_notify_user(notifiable_users) robot.put_to_memory("box_list", table)
def vm_me(res): boxes_rx = re.compile(r'(?<=vm me).*') rq = boxes_rx.findall(res.message.text) searching = [i.strip() for i in re.split(r'[&,]', rq[0])] both = 'ui' in searching and 'optic' in searching mem = robot.get_from_memory('box_list') free = [b for b in mem if mem[b].free] chosen = [] for f in free: match = find_box_match(f, searching) if not match: continue # if we're looking for both ui and optic boxes and we found one of them if both and match in ['ui', 'optic']: # get the partner box p_box = f.replace('-ui', '') if match == 'ui' else f + '-ui' if p_box not in free: # partner is taken skip continue chosen.append(p_box) searching.remove('ui' if match != 'ui' else 'optic') chosen.append(f) # add the box we just found to the chosen box list searching.remove( match ) # remove the box type we matched from the list of boxes we're still looking for if not searching: break if len(searching) == 0 and chosen: assign_boxes(chosen, res.message.user) # mark chosen boxes as in use message = '\n'.join(chosen) robot.send( res.message.room, "I have assigned the following box{0} to you:\n{1}".format( 'es' if len(chosen) > 1 else '', message)) # tell user which boxes we assigned to them return robot.send( res.message.room, "I'm sorry but there were not enough free boxes to meet your request :(" )