Ejemplo n.º 1
0
def message_react(token, message_id, react_id):
    users = unbox('users', {})
    channels = unbox('channels', {})
    messages = unbox('messages', {})

    auth = users[str(decode(token)['u_id'])]
    message = messages[str(message_id)]
    channel = channels[str(message['channel_id'])]

    if auth['u_id'] not in channel['all_members']:
        raise AccessError("Unauthorised")

    if react_id not in [1]:
        raise ValueError(f"Invalid ID: react_id - {react_id}")

    reacts = message['reacts']

    if str(react_id) in reacts and auth['u_id'] in reacts[str(
            react_id)]['u_ids']:
        raise ValueError("React already exists")

    if str(react_id) in reacts:
        reacts[str(react_id)]['u_ids'].append(auth['u_id'])
    else:
        reacts[str(react_id)] = {'react_id': react_id, 'u_ids': [auth['u_id']]}

    message['reacts'] = reacts
    messages[str(message_id)] = message

    box('messages', messages)

    return {}
Ejemplo n.º 2
0
def search(token, query_str):
    users = unbox('users', {})
    channels = unbox('channels', {})
    messages = unbox('messages', {})

    auth = users[str(decode(token)['u_id'])]
    their_channels = [
        int(id) for id in channels
        if auth['u_id'] in channels[id]['all_members']
    ]

    # A dictionary {'messages' : [ list of messages ]}
    # Line 38 contains conditional expression to check message satisfies search criteria
    return {
        'messages':
        [{
            'message_id':
            m['message_id'],
            'u_id':
            m['u_id'],
            'message':
            m['message'],
            'time_created':
            m['time_created'],
            'reacts': [{
                'react_id': r['react_id'],
                'u_ids': r['u_ids'],
                'is_this_user_reacted': (auth['u_id'] in r['u_ids'])
            } for r in m['reacts'].values()],
            'is_pinned':
            m['is_pinned']
        } for m in messages.values()
         if m['channel_id'] in their_channels and query_str in m['message']]
    }
Ejemplo n.º 3
0
def message_unreact(token, message_id, react_id):
	users = unbox('users', {})
	channels = unbox('channels', {})
	messages = unbox('messages', {})

	auth = users[str(decode(token)['u_id'])]
	message = messages[str(message_id)]
	channel = channels[str(message['channel_id'])]

	if auth['u_id'] not in channel['all_members']:
		raise AccessError("Unauthorised")

	if react_id not in [1]:
		raise ValueError(f"Invalid ID: react_id - {react_id}")

	reacts = messages[str(message_id)]['reacts']

	if str(react_id) not in reacts or auth['u_id'] not in reacts[str(react_id)]['u_ids']:
		raise ValueError("React doesn't exist")

	messages[str(message_id)]['reacts'][str(react_id)]['u_ids'].remove(auth['u_id'])

	box('messages', messages)

	return {}
Ejemplo n.º 4
0
def message_send(token, channel_id, message):
    users = unbox('users', {})
    channels = unbox('channels', {})
    messages = unbox('messages', {})

    auth = users[str(decode(token)['u_id'])]
    channel = channels[str(channel_id)]

    if auth['u_id'] not in channel['all_members']:
        raise AccessError("Unauthorised")

    if not (1 <= len(message) <= 1000):
        raise ValueError("Message is either too long or too short")

    message_id = 0 if len(messages) == 0 else max([int(id)
                                                   for id in messages]) + 1

    messages[str(message_id)] = {
        'message_id': message_id,
        'channel_id': channel_id,
        'u_id': auth['u_id'],
        'message': message,
        'time_created': int(time.time()),
        'reacts': {},
        'is_pinned': False
    }

    box('messages', messages)

    return {'message_id': message_id}
Ejemplo n.º 5
0
def user_profiles_uploadphoto(token, img_url, x_start, y_start, x_end, y_end):
    if img_url[-4:] != '.jpg' and img_url[-5:] != '.jpeg':
        raise ValueError(f"Invalid url: '{img_url}'")

    identifier = str(uuid.uuid4())

    PROFILE_IMG_URL = unbox('url_base',
                            '') + '/user/profiles/photo/' + identifier + '.jpg'
    FILE = os.path.join(os.path.dirname(os.path.realpath(__file__)),
                        '../utility/storage/' + identifier + '.jpg')

    try:
        urllib.request.urlretrieve(img_url, FILE)
    except Exception:
        raise ValueError(f"Cannot retrieve image: '{img_url}'")

    try:
        img = Image.open(FILE)
        cropped = img.crop((x_start, y_start, x_end, y_end))
        cropped.save(FILE)
    except Exception:
        os.remove(FILE)
        raise ValueError("Cannot crop image")

    users = unbox('users', [])
    users[str(decode(token)['u_id'])]['profile_img_url'] = PROFILE_IMG_URL
    box('users', users)

    return {}
Ejemplo n.º 6
0
def channels_create(token, name, is_public):
    users = unbox('users', {})
    channels = unbox('channels', {})

    auth = users[str(decode(token)['u_id'])]

    if auth['permission_id'] == 3:
        raise AccessError("Unauthorised")

    if len(name) > 20:
        raise ValueError("Invalid name (too long)")

    channel_id = 0 if len(channels) == 0 else max([int(id)
                                                   for id in channels]) + 1

    channels[str(channel_id)] = {
        'channel_id': channel_id,
        'name': name,
        'is_public': is_public,
        'all_members': [auth['u_id']],
        'owner_members': [auth['u_id']]
    }

    box('channels', channels)

    return {'channel_id': channel_id}
Ejemplo n.º 7
0
def channels_list(token):
    users = unbox('users', {})
    channels = unbox('channels', {})

    auth = users[str(decode(token)['u_id'])]

    return {
        'channels': [{
            'channel_id': channels[id]['channel_id'],
            'name': channels[id]['name']
        } for id in channels if auth['u_id'] in channels[id]['all_members']]
    }
Ejemplo n.º 8
0
def channel_details(token, channel_id):
	users = unbox('users', {})
	channels = unbox('channels', {})

	auth = users[str(decode(token)['u_id'])]

	channel = channels[str(channel_id)]

	if auth['u_id'] not in channel['all_members']:
		raise AccessError("Unauthorised")

	return {'name' : channel['name'],
		'owner_members': [{'u_id': u['u_id'], 'name_first': u['name_first'], 'name_last': u['name_last'], 'profile_img_url': u['profile_img_url']}
			for u in [users[str(id)] for id in channel['owner_members']]],
		'all_members': [{'u_id': u['u_id'], 'name_first': u['name_first'], 'name_last': u['name_last'], 'profile_img_url': u['profile_img_url']}
			for u in [users[str(id)] for id in channel['all_members']]]}
Ejemplo n.º 9
0
def message_remove(token, message_id):
    users = unbox('users', {})
    channels = unbox('channels', {})
    messages = unbox('messages', {})

    auth = users[str(decode(token)['u_id'])]
    message = messages[str(message_id)]
    channel = channels[str(message['channel_id'])]

    if message['u_id'] != auth['u_id'] and auth['permission_id'] == 3 and auth[
            'u_id'] not in channel['owner_members']:
        raise AccessError("Unauthorised")

    del messages[str(message_id)]

    box('messages', messages)

    return {}
Ejemplo n.º 10
0
def user_profile_setname(token, name_first, name_last):
    if not (1 < len(name_first) < 50):
        raise ValueError("First name too short")

    if not (1 < len(name_last) < 50):
        raise ValueError("Last name too short")

    users = unbox('users', {})
    auth = users[str(decode(token)['u_id'])]

    auth['name_first'] = name_first
    auth['name_last'] = name_last

    users[str(auth['u_id'])] = auth

    box('users', users)

    return {}
Ejemplo n.º 11
0
def channel_messages(token, channel_id, start):
    users = unbox('users', {})
    channels = unbox('channels', {})
    messages = unbox('messages', {})

    auth = users[str(decode(token)['u_id'])]

    channel = channels[str(channel_id)]

    if auth['u_id'] not in channel['all_members']:
        raise AccessError("Unauthorised")

    messages = [{
        'message_id':
        m['message_id'],
        'u_id':
        m['u_id'],
        'time_created':
        m['time_created'],
        'reacts': [{
            'react_id': r['react_id'],
            'u_ids': r['u_ids'],
            'is_this_user_reacted': (auth['u_id'] in r['u_ids'])
        } for r in m['reacts'].values()],
        'is_pinned':
        m['is_pinned'],
        'message':
        m['message']
    } for m in sorted(
        [m for m in messages.values() if m['channel_id'] == channel_id],
        key=lambda k: k['time_created'])]

    count = len(messages)

    if start > count:
        raise ValueError("Requesting out of range messages")

    end = -1 if count - start < 50 else start + 50

    return {
        'messages': messages[start:] if end == -1 else messages[start:end - 1],
        'start': start,
        'end': end
    }
Ejemplo n.º 12
0
def channel_leave(token, channel_id):
    users = unbox('users', {})
    channels = unbox('channels', {})

    auth = users[str(decode(token)['u_id'])]

    channel = channels[str(channel_id)]

    if auth['u_id'] in channel['all_members']:
        channel['all_members'].remove(auth['u_id'])

        if auth['u_id'] in channel['owner_members']:
            channel['owner_members'].remove(auth['u_id'])

    channels[str(channel_id)] = channel

    box('channels', channels)

    return {}
Ejemplo n.º 13
0
def channel_join(token, channel_id):
    users = unbox('users', {})
    channels = unbox('channels', {})

    auth = users[str(decode(token)['u_id'])]

    channel = channels[str(channel_id)]

    if auth['u_id'] in channel['all_members']:
        raise ValueError("Already a member")

    if auth['permission_id'] == 3 and not channel['is_public']:
        raise AccessError("Unauthorised")

    channel['all_members'].append(auth['u_id'])

    channels[str(channel_id)] = channel

    box('channels', channels)

    return {}
Ejemplo n.º 14
0
def message_unpin(token, message_id):
    users = unbox('users', {})
    channels = unbox('channels', {})
    messages = unbox('messages', {})

    auth = users[str(decode(token)['u_id'])]
    message = messages[str(message_id)]
    channel = channels[str(message['channel_id'])]

    if not message['is_pinned']:
        raise ValueError("Message is not pinned")

    if auth['permission_id'] == 3 and auth['u_id'] not in channel[
            'owner_members']:
        raise AccessError("Unauthorised")

    message['is_pinned'] = False
    messages[str(message_id)] = message

    box('messages', messages)

    return {}
Ejemplo n.º 15
0
def message_edit(token, message_id, message):
    users = unbox('users', {})
    channels = unbox('channels', {})
    messages = unbox('messages', {})

    auth = users[str(decode(token)['u_id'])]

    object = messages[str(message_id)]
    channel = channels[str(object['channel_id'])]

    if object['u_id'] != auth['u_id'] and auth['permission_id'] == 3 and auth[
            'u_id'] not in channel['owner_members']:
        raise AccessError("Unauthorised")

    if not message:
        message_remove.message_remove(token, message_id)
    else:
        object['message'] = message
        messages[str(message_id)] = object

        box('messages', messages)

    return {}
Ejemplo n.º 16
0
def channel_invite(token, channel_id, u_id):
    users = unbox('users', {})
    channels = unbox('channels', {})

    auth = users[str(decode(token)['u_id'])]
    user = users[str(u_id)]

    channel = channels[str(channel_id)]

    if user['u_id'] in channel['all_members']:
        raise ValueError("User already member")

    if auth['permission_id'] == 3 and auth['u_id'] not in channel[
            'all_members']:
        raise AccessError("Unauthorised")

    channel['all_members'].append(u_id)

    channels[str(channel_id)] = channel

    box('channels', channels)

    return {}
Ejemplo n.º 17
0
def standup_send(token, channel_id, message):
	users = unbox('users', {})
	channels = unbox('channels', {})
	channel_id_to_time_finish = unbox('channel_id_to_time_finish', {})
	channel_id_to_messages = unbox('channel_id_to_messages', {})

	auth = users[str(decode(token)['u_id'])]
	channel = channels[str(channel_id)]

	if str(channel_id) not in channel_id_to_time_finish:
		raise ValueError("No standup has been started")

	if auth['u_id'] not in channel['all_members']:
		raise AccessError("Unauthorised")

	if not (1 <= len(message) <= 1000):
		raise ValueError("Message too long or too short")

	channel_id_to_messages[str(channel_id)].append({'u_id': auth['u_id'], 'message': message})

	box('channel_id_to_messages', channel_id_to_messages)

	return {}
Ejemplo n.º 18
0
def standup_start(token, channel_id, length):
    users = unbox('users', {})
    channels = unbox('channels', {})
    channel_id_to_time_finish = unbox('channel_id_to_time_finish', {})
    channel_id_to_messages = unbox('channel_id_to_messages', {})

    auth = users[str(decode(token)['u_id'])]
    channel = channels[str(channel_id)]

    if str(channel_id) in channel_id_to_time_finish:
        raise ValueError("Standup already started")

    time_finish = int(time.time()) + length
    channel_id_to_time_finish[str(channel_id)] = time_finish
    channel_id_to_messages[str(channel_id)] = []

    box('channel_id_to_messages', channel_id_to_messages)
    box('channel_id_to_time_finish', channel_id_to_time_finish)

    timer = Timer(length, _delay, args=[token, channel_id], kwargs=None)
    timer.start()

    return {'time_finish': time_finish}
Ejemplo n.º 19
0
def user_profile_sethandle(token, handle_str):
    handle_to_u_id = unbox('handle_to_u_id', {})
    users = unbox('users', {})

    if not (3 <= len(handle_str) <= 20):
        raise ValueError("Handle too long or too short")

    if handle_str in handle_to_u_id:
        raise ValueError("Handle already in use")

    auth = users[str(decode(token)['u_id'])]

    del handle_to_u_id[auth['handle_str']]

    auth['handle_str'] = handle_str
    handle_to_u_id[handle_str] = auth['u_id']

    users[str(auth['u_id'])] = auth

    box('handle_to_u_id', handle_to_u_id)
    box('users', users)

    return {}
Ejemplo n.º 20
0
def message_sendlater(token, channel_id, message, time_sent):
	users = unbox('users', {})
	channels = unbox('channels', {})
	messages = unbox('messages', {})

	auth = users[str(decode(token)['u_id'])]
	channel = channels[str(channel_id)]

	if auth['u_id'] not in channel['all_members']:
		raise AccessError("Unauthorised")

	if not (1 <= len(message) <= 1000):
		raise ValueError("Message is either too long or too short")

	nowish = int(time.time())

	if time_sent < nowish:
		raise ValueError("Time to send is in the past")

	message_id = 0 if len(messages) == 0 else max([int(id) for id in messages]) + 1

	messages[str(message_id)] = {
		'message_id': message_id,
		'channel_id': None,
		'u_id': None,
		'message': message,
		'time_created': time_sent,
		'reacts': {},
		'is_pinned': False
	}

	box('messages', messages)

	timer = Timer(time_sent - nowish, _delayed, args=[auth['u_id'], message_id, channel_id], kwargs=None)
	timer.start()

	return { 'message_id': message_id }
Ejemplo n.º 21
0
def user_profile_setemail(token, email):
    email_to_u_id = unbox('email_to_u_id', {})
    users = unbox('users', {})

    auth = users[str(decode(token)['u_id'])]

    if not re.search('^\w+([\.-]?\w+)*@\w+([\.-]?\w+)*(\.\w{2,3})+$', email):
        raise ValueError(f"Invalid email: {email}")

    if email in email_to_u_id:
        raise ValueError("Email already in use")

    del email_to_u_id[auth['email']]

    auth['email'] = email
    email_to_u_id[email] = auth['u_id']

    # update users
    users[str(auth['u_id'])] = auth

    box('email_to_u_id', email_to_u_id)
    box('users', users)

    return {}