Implement egg-timer for legacy and vanilla clients

This commit is contained in:
Ben
2019-09-09 22:26:11 +01:00
parent 2ecd9f1850
commit 1c03374bd8
7 changed files with 68 additions and 5 deletions

View File

@@ -11,7 +11,7 @@ import asyncio
import bcrypt
import os
from datetime import datetime
from datetime import datetime, timedelta
@handlers.handler(XMLPacket('login'))
@@ -73,6 +73,14 @@ async def handle_login(p, credentials: Credentials):
if data.grounded:
return await p.send_error_and_disconnect(913)
if data.timer_active:
if not data.timer_start < datetime.now().time() < data.timer_end:
return await p.send_error_and_disconnect(911, data.timer_start, data.timer_end)
if await data.minutes_played_today >= data.timer_total.total_seconds() // 60:
return await p.send_error_and_disconnect(910, data.timer_total)
active_ban = await Ban.query.where(Ban.penguin_id == data.id and Ban.expires >= datetime.now()).gino.first()
if active_ban is not None:

View File

@@ -1,9 +1,11 @@
from houdini import handlers
from houdini.handlers import XTPacket
from houdini.data.room import Room
from houdini.data.penguin import Login
import random
import time
from datetime import datetime
@handlers.handler(XTPacket('j', 'js'), pre_login=True)
@@ -26,7 +28,17 @@ async def handle_join_server(p, penguin_id: int, login_key: str):
penguin_standard_time = current_time * 1000
server_time_offset = 7
await p.send_xt('lp', await p.string, p.data.coins, int(p.data.safe_chat), 1440,
if p.data.timer_active:
minutes_until_timer_end = datetime.combine(datetime.today(), p.data.timer_end) - datetime.now()
minutes_until_timer_end = minutes_until_timer_end.total_seconds() // 60
minutes_played_today = await p.data.minutes_played_today
minutes_left_today = (p.data.timer_total.total_seconds() // 60) - minutes_played_today
p.egg_timer_minutes = int(min(minutes_until_timer_end, minutes_left_today))
else:
p.egg_timer_minutes = 24 * 60
await p.send_xt('lp', await p.string, p.data.coins, int(p.data.safe_chat), p.egg_timer_minutes,
penguin_standard_time, p.data.age, 0, p.data.minutes_played,
"membership_days", server_time_offset, int(p.data.opened_playercard),
p.data.map_category, p.data.status_field)

View File

@@ -45,6 +45,37 @@ async def server_heartbeat(server):
for penguin in server.penguins_by_id.values():
if penguin.heartbeat < timer:
await penguin.close()
async def server_egg_timer(server):
while True:
await asyncio.sleep(60)
for p in server.penguins_by_id.values():
if p.data.timer_active:
p.egg_timer_minutes -= 1
if p.client_type == ClientType.Vanilla:
minutes_until_timer_end = datetime.combine(datetime.today(), p.data.timer_end) - datetime.now()
minutes_until_timer_end = minutes_until_timer_end.total_seconds() // 60
if minutes_until_timer_end <= p.egg_timer_minutes + 1:
if p.egg_timer_minutes == 7:
await p.send_error(915, p.egg_timer_minutes, p.data.timer_start, p.data.timer_end)
elif p.egg_timer_minutes == 5:
await p.send_error(915, p.egg_timer_minutes, p.data.timer_start, p.data.timer_end)
else:
if p.egg_timer_minutes == 7:
await p.send_error(914, p.egg_timer_minutes, p.data.timer_total)
elif p.egg_timer_minutes == 5:
await p.send_error(914, p.egg_timer_minutes, p.data.timer_total)
await p.send_xt('uet', p.egg_timer_minutes)
if p.egg_timer_minutes <= 0:
await p.send_error_and_disconnect(916, p.data.timer_start, p.data.timer_end)
else:
if p.egg_timer_minutes <= 0:
await p.send_error_and_disconnect(910)
@handlers.handler(XTPacket('u', 'h'))
@handlers.cooldown(59)
async def handle_heartbeat(p):