guild: add mod blueprint

to keep moderation-related routes in a single blueprint
This commit is contained in:
Luna Mendes 2018-10-27 22:27:05 -03:00
parent bbc39a953a
commit 65b47e74bf
4 changed files with 116 additions and 108 deletions

View File

@ -1,3 +1,4 @@
from .roles import bp as guild_roles from .roles import bp as guild_roles
from .members import bp as guild_members from .members import bp as guild_members
from .channels import bp as guild_channels from .channels import bp as guild_channels
from .mod import bp as guild_mod

View File

@ -0,0 +1,112 @@
from quart import Blueprint, request, current_app as app, jsonify
from litecord.blueprints.auth import token_check
from litecord.blueprints.checks import guild_owner_check
bp = Blueprint('guild_moderation', __name__)
async def remove_member(guild_id: int, member_id: int):
"""Do common tasks related to deleting a member from the guild,
such as dispatching GUILD_DELETE and GUILD_MEMBER_REMOVE."""
await app.db.execute("""
DELETE FROM members
WHERE guild_id = $1 AND user_id = $2
""", guild_id, member_id)
await app.dispatcher.dispatch_user(member_id, 'GUILD_DELETE', {
'guild_id': guild_id,
'unavailable': False,
})
await app.dispatcher.unsub('guild', guild_id, member_id)
await app.dispatcher.dispatch_guild(guild_id, 'GUILD_MEMBER_REMOVE', {
'guild_id': str(guild_id),
'user': await app.storage.get_user(member_id),
})
@bp.route('/<int:guild_id>/members/<int:member_id>', methods=['DELETE'])
async def kick_member(guild_id, member_id):
"""Remove a member from a guild."""
user_id = await token_check()
# TODO: check KICK_MEMBERS permission
await guild_owner_check(user_id, guild_id)
await remove_member(guild_id, member_id)
return '', 204
@bp.route('/<int:guild_id>/bans', methods=['GET'])
async def get_bans(guild_id):
user_id = await token_check()
# TODO: check BAN_MEMBERS permission
await guild_owner_check(user_id, guild_id)
bans = await app.db.fetch("""
SELECT user_id, reason
FROM bans
WHERE bans.guild_id = $1
""", guild_id)
res = []
for ban in bans:
res.append({
'reason': ban['reason'],
'user': await app.storage.get_user(ban['user_id'])
})
return jsonify(res)
@bp.route('/<int:guild_id>/bans/<int:member_id>', methods=['PUT'])
async def create_ban(guild_id, member_id):
user_id = await token_check()
# TODO: check BAN_MEMBERS permission
await guild_owner_check(user_id, guild_id)
j = await request.get_json()
await app.db.execute("""
INSERT INTO bans (guild_id, user_id, reason)
VALUES ($1, $2, $3)
""", guild_id, member_id, j.get('reason', ''))
await remove_member(guild_id, member_id)
await app.dispatcher.dispatch_guild(guild_id, 'GUILD_BAN_ADD', {
'guild_id': str(guild_id),
'user': await app.storage.get_user(member_id)
})
return '', 204
@bp.route('/<int:guild_id>/bans/<int:banned_id>', methods=['DELETE'])
async def remove_ban(guild_id, banned_id):
user_id = await token_check()
# TODO: check BAN_MEMBERS permission
await guild_owner_check(guild_id, user_id)
res = await app.db.execute("""
DELETE FROM bans
WHERE guild_id = $1 AND user_id = $@
""", guild_id, banned_id)
# we don't really need to dispatch GUILD_BAN_REMOVE
# when no bans were actually removed.
if res == 'DELETE 0':
return '', 204
await app.dispatcher.dispatch_guild(guild_id, 'GUILD_BAN_REMOVE', {
'guild_id': str(guild_id),
'user': await app.storage.get_user(banned_id)
})
return '', 204

View File

@ -11,7 +11,6 @@ from ..enums import ChannelType
from ..schemas import ( from ..schemas import (
validate, GUILD_CREATE, GUILD_UPDATE validate, GUILD_CREATE, GUILD_UPDATE
) )
from ..utils import dict_get
from .channels import channel_ack from .channels import channel_ack
from .checks import guild_check, guild_owner_check from .checks import guild_check, guild_owner_check
@ -237,112 +236,6 @@ async def delete_guild(guild_id):
return '', 204 return '', 204
async def remove_member(guild_id: int, member_id: int):
"""Do common tasks related to deleting a member from the guild,
such as dispatching GUILD_DELETE and GUILD_MEMBER_REMOVE."""
await app.db.execute("""
DELETE FROM members
WHERE guild_id = $1 AND user_id = $2
""", guild_id, member_id)
await app.dispatcher.dispatch_user(member_id, 'GUILD_DELETE', {
'guild_id': guild_id,
'unavailable': False,
})
await app.dispatcher.unsub('guild', guild_id, member_id)
await app.dispatcher.dispatch_guild(guild_id, 'GUILD_MEMBER_REMOVE', {
'guild_id': str(guild_id),
'user': await app.storage.get_user(member_id),
})
@bp.route('/<int:guild_id>/members/<int:member_id>', methods=['DELETE'])
async def kick_member(guild_id, member_id):
"""Remove a member from a guild."""
user_id = await token_check()
# TODO: check KICK_MEMBERS permission
await guild_owner_check(user_id, guild_id)
await remove_member(guild_id, member_id)
return '', 204
@bp.route('/<int:guild_id>/bans', methods=['GET'])
async def get_bans(guild_id):
user_id = await token_check()
# TODO: check BAN_MEMBERS permission
await guild_owner_check(user_id, guild_id)
bans = await app.db.fetch("""
SELECT user_id, reason
FROM bans
WHERE bans.guild_id = $1
""", guild_id)
res = []
for ban in bans:
res.append({
'reason': ban['reason'],
'user': await app.storage.get_user(ban['user_id'])
})
return jsonify(res)
@bp.route('/<int:guild_id>/bans/<int:member_id>', methods=['PUT'])
async def create_ban(guild_id, member_id):
user_id = await token_check()
# TODO: check BAN_MEMBERS permission
await guild_owner_check(user_id, guild_id)
j = await request.get_json()
await app.db.execute("""
INSERT INTO bans (guild_id, user_id, reason)
VALUES ($1, $2, $3)
""", guild_id, member_id, j.get('reason', ''))
await remove_member(guild_id, member_id)
await app.dispatcher.dispatch_guild(guild_id, 'GUILD_BAN_ADD', {
'guild_id': str(guild_id),
'user': await app.storage.get_user(member_id)
})
return '', 204
@bp.route('/<int:guild_id>/bans/<int:banned_id>', methods=['DELETE'])
async def remove_ban(guild_id, banned_id):
user_id = await token_check()
# TODO: check BAN_MEMBERS permission
await guild_owner_check(guild_id, user_id)
res = await app.db.execute("""
DELETE FROM bans
WHERE guild_id = $1 AND user_id = $@
""", guild_id, banned_id)
# we don't really need to dispatch GUILD_BAN_REMOVE
# when no bans were actually removed.
if res == 'DELETE 0':
return '', 204
await app.dispatcher.dispatch_guild(guild_id, 'GUILD_BAN_REMOVE', {
'guild_id': str(guild_id),
'user': await app.storage.get_user(banned_id)
})
return '', 204
@bp.route('/<int:guild_id>/messages/search') @bp.route('/<int:guild_id>/messages/search')
async def search_messages(guild_id): async def search_messages(guild_id):
"""Search messages in a guild. """Search messages in a guild.

4
run.py
View File

@ -19,7 +19,7 @@ from litecord.blueprints import (
# for code readability if people want to dig through # for code readability if people want to dig through
# the codebase. # the codebase.
from litecord.blueprints.guild import ( from litecord.blueprints.guild import (
guild_roles, guild_members, guild_channels guild_roles, guild_members, guild_channels, mod
) )
from litecord.gateway import websocket_handler from litecord.gateway import websocket_handler
@ -65,6 +65,8 @@ bps = {
guild_roles: '/guilds', guild_roles: '/guilds',
guild_members: '/guilds', guild_members: '/guilds',
guild_channels: '/guilds', guild_channels: '/guilds',
# mod for moderation
mod: '/guilds',
channels: '/channels', channels: '/channels',
webhooks: None, webhooks: None,