mirror of
https://github.com/solero/houdini.git
synced 2025-04-25 08:06:29 +00:00
151 lines
6.1 KiB
Python
151 lines
6.1 KiB
Python
from houdini import handlers
|
|
from houdini.data import db
|
|
from houdini.handlers import XTPacket
|
|
from houdini.data.moderator import Ban, Warning, Report
|
|
from houdini.data.penguin import Penguin
|
|
from houdini.constants import ClientType
|
|
|
|
import datetime
|
|
|
|
|
|
@handlers.handler(XTPacket('o', 'k'))
|
|
async def handle_kick_player(p, penguin_id: int):
|
|
if p.moderator:
|
|
await moderator_kick(p, penguin_id)
|
|
|
|
|
|
@handlers.handler(XTPacket('o', 'b'), client=ClientType.Legacy)
|
|
async def handle_ban_player(p, penguin_id: int, message: str):
|
|
if p.moderator:
|
|
await moderator_ban(p, penguin_id, comment=message)
|
|
|
|
|
|
@handlers.handler(XTPacket('o', 'm'))
|
|
async def handle_mute_player(p, penguin_id: int):
|
|
if p.moderator:
|
|
if penguin_id in p.server.penguins_by_id:
|
|
player = p.server.penguins_by_id[penguin_id]
|
|
if not player.moderator:
|
|
player.muted = True
|
|
|
|
|
|
@handlers.handler(XTPacket('o', 'initban'), client=ClientType.Vanilla)
|
|
@handlers.player_attribute(moderator=True)
|
|
async def handle_init_ban(p, penguin_id: int, message: str):
|
|
player = p.server.penguins_by_id[penguin_id] if penguin_id in p.server.penguins_by_id \
|
|
else await Penguin.get(penguin_id)
|
|
if not player.moderator:
|
|
number_bans = await db.select([db.func.count(Ban.penguin_id)]).where(
|
|
Ban.penguin_id == player.id).gino.scalar()
|
|
|
|
await p.send_xt('initban', penguin_id, 0, number_bans, message, player.username)
|
|
|
|
|
|
@handlers.handler(XTPacket('o', 'ban'), client=ClientType.Vanilla)
|
|
@handlers.player_attribute(moderator=True)
|
|
async def handle_moderator_ban(p, penguin_id: int, ban_type: int, reason: int, duration: int, message: str, notes: str):
|
|
player = p.server.penguins_by_id[penguin_id] if penguin_id in p.server.penguins_by_id \
|
|
else await Penguin.get(penguin_id)
|
|
if not player.moderator:
|
|
date_issued = datetime.datetime.now()
|
|
date_expires = date_issued + datetime.timedelta(hours=duration)
|
|
|
|
if duration == 0:
|
|
await player.update(permaban=True).apply()
|
|
|
|
await Ban.create(penguin_id=player.id, issued=date_issued, expires=date_expires,
|
|
moderator_id=p.id, reason=reason, comment=notes, message=message)
|
|
|
|
if penguin_id in p.server.penguins_by_id:
|
|
if player.is_vanilla_client:
|
|
await player.send_xt('ban', ban_type, reason, duration, notes)
|
|
else:
|
|
await player.send_error(610, message)
|
|
await player.close()
|
|
|
|
|
|
@handlers.handler(XTPacket('m', 'r'))
|
|
async def handle_report(p, penguin_id: int, reason: int = 0):
|
|
date_now = datetime.datetime.now()
|
|
await Report.create(penguin_id=penguin_id, reporter_id=p.id, report_type=reason,
|
|
date=date_now, server_id=p.server.config.id, room_id=p.room.id)
|
|
|
|
|
|
@handlers.handler(XTPacket('o', 'moderatormessage'), client=ClientType.Vanilla)
|
|
@handlers.player_attribute(moderator=True)
|
|
async def handle_moderator_message(p, warning_type: int, penguin_id: int):
|
|
player = p.server.penguins_by_id[penguin_id] if penguin_id in p.server.penguins_by_id \
|
|
else await Penguin.get(penguin_id)
|
|
date_issued = datetime.datetime.now()
|
|
date_expires = date_issued + datetime.timedelta(hours=48)
|
|
warning_count = await db.select([db.func.count(Warning.expires)]).where(
|
|
(Warning.penguin_id == player.id) & (Warning.expires >= date_issued)).gino.scalar()
|
|
|
|
if warning_count >= 3:
|
|
return await moderator_ban(p, player.id, message='Exceeded warning limit')
|
|
|
|
await player.send_xt('moderatormessage', warning_type)
|
|
await Warning.create(penguin_id=player.id, issued=date_issued, expires=date_expires)
|
|
|
|
|
|
async def cheat_kick(p, penguin_id):
|
|
if penguin_id in p.server.penguins_by_id:
|
|
await p.server.penguins_by_id[penguin_id].send_error_and_disconnect(800)
|
|
|
|
|
|
async def cheat_ban(p, penguin_id, hours=24, comment=''):
|
|
if penguin_id in p.server.penguins_by_id:
|
|
player = p.server.penguins_by_id[penguin_id]
|
|
|
|
number_bans = await db.select([db.func.count(Ban.penguin_id)]).where(
|
|
Ban.penguin_id == player.id).gino.scalar()
|
|
|
|
date_issued = datetime.datetime.now()
|
|
date_expires = date_issued + datetime.timedelta(hours=hours)
|
|
|
|
if number_bans >= 3:
|
|
await player.update(permaban=True).apply()
|
|
|
|
await Ban.create(penguin_id=player.id, issued=date_issued, expires=date_expires,
|
|
moderator_id=p.id, reason=1, comment=comment, message='Cheat ban')
|
|
|
|
if penguin_id in p.server.penguins_by_id:
|
|
await player.send_error_and_disconnect(611, comment)
|
|
|
|
|
|
async def moderator_kick(p, penguin_id):
|
|
if penguin_id in p.server.penguins_by_id:
|
|
player = p.server.penguins_by_id[penguin_id]
|
|
if not player.moderator:
|
|
for penguin in p.server.penguins_by_id.values():
|
|
if penguin.moderator:
|
|
await penguin.send_xt('ma', 'k', penguin_id, player.username)
|
|
await player.send_error_and_disconnect(5)
|
|
|
|
|
|
async def moderator_ban(p, penguin_id, hours=24, comment='', message=''):
|
|
player = p.server.penguins_by_id[penguin_id] if penguin_id in p.server.penguins_by_id \
|
|
else await Penguin.get(penguin_id)
|
|
if not player.moderator:
|
|
for penguin in p.server.penguins_by_id.values():
|
|
if penguin.moderator:
|
|
await penguin.send_xt('ma', 'b', penguin_id, player.username)
|
|
|
|
number_bans = await db.select([db.func.count(Ban.penguin_id)]).where(
|
|
Ban.penguin_id == player.id).gino.scalar()
|
|
|
|
date_issued = datetime.datetime.now()
|
|
date_expires = date_issued + datetime.timedelta(hours=hours)
|
|
|
|
if number_bans >= 3:
|
|
await player.update(permaban=True).apply()
|
|
|
|
await Ban.create(penguin_id=player.id, issued=date_issued, expires=date_expires,
|
|
moderator_id=p.id, reason=2, comment=comment, message=message)
|
|
|
|
if penguin_id in p.server.penguins_by_id:
|
|
if player.is_vanilla_client:
|
|
await player.send_xt('ban', 612, 2, hours, comment)
|
|
else:
|
|
await player.send_error_and_disconnect(610, comment)
|