mirror of https://gitlab.com/litecord/litecord.git
guild: add mod blueprint
to keep moderation-related routes in a single blueprint
This commit is contained in:
parent
bbc39a953a
commit
65b47e74bf
|
|
@ -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
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
|
|
@ -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
4
run.py
|
|
@ -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,
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue