Esempio n. 1
0
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)
Esempio n. 2
0
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)
Esempio n. 3
0
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))
Esempio n. 4
0
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)
Esempio n. 5
0
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)
Esempio n. 6
0
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)
Esempio n. 7
0
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 :("
    )