Implement server kicks and updating the server time on the page according to heartbeats
This commit is contained in:
@@ -46,6 +46,19 @@ class PlayerDeathEvent(Event):
|
||||
super(PlayerDeathEvent, self).__init__(type='player-death',
|
||||
data={'player': player, 'message': message})
|
||||
|
||||
class ServerHeartbeatEvent(Event):
|
||||
def __init__(self, server, data):
|
||||
now = server.current_time()
|
||||
t = now.second+now.minute*60+now.hour*60*60
|
||||
super(ServerHeartbeatEvent, self).__init__(type='server-heartbeat',
|
||||
data={'server': server.id, 'heartbeat': data, 'time': t,
|
||||
'day-period': server.day_period()})
|
||||
|
||||
class KickEvent(Event):
|
||||
def __init__(self, user, message):
|
||||
super(KickEvent, self).__init__(type='player-kick',
|
||||
data={'player': user, 'message': message})
|
||||
|
||||
class PlayerMessageEvent(Event):
|
||||
def __init__(self, user, message):
|
||||
super(PlayerMessageEvent, self).__init__(type='player-message',
|
||||
|
@@ -2,7 +2,6 @@ from piston.handler import AnonymousBaseHandler, BaseHandler
|
||||
import time
|
||||
from django.core.cache import cache
|
||||
from django.conf import settings
|
||||
from django.core.cache import cache
|
||||
import appversion
|
||||
from minecraft.models import MinecraftProfile
|
||||
from local.models import Quote
|
||||
@@ -13,7 +12,7 @@ from urllib2 import urlopen
|
||||
import json
|
||||
from datetime import datetime
|
||||
from models import cachePlayerList
|
||||
from events import server_queue, web_queue, chat, server_broadcast, send_web_event, QuitEvent, JoinEvent, PlayerDeathEvent
|
||||
from events import server_queue, web_queue, chat, server_broadcast, send_web_event, QuitEvent, JoinEvent, PlayerDeathEvent, ServerHeartbeatEvent
|
||||
from bounty.models import Bounty
|
||||
from vault.models import VaultSlot
|
||||
|
||||
@@ -116,6 +115,9 @@ class ServerEventHandler(BaseHandler):
|
||||
if evt['type'] == 'player-death':
|
||||
send_web_event(PlayerDeathEvent(evt['payload']['player'],
|
||||
evt['payload']['message']))
|
||||
if evt['type'] == 'heartbeat':
|
||||
cache.set('caminus-server-heartbeat-%s'%(request.server.id), evt['payload'], 86400)
|
||||
send_web_event(ServerHeartbeatEvent(request.server, evt['payload']))
|
||||
if evt['type'] == 'player-murder':
|
||||
bounties = Bounty.objects.filter(target__mc_username=evt['payload']['player'])
|
||||
killer = MinecraftProfile.objects.get(mc_username=evt['payload']['killer'])
|
||||
|
@@ -1,4 +1,6 @@
|
||||
import models
|
||||
|
||||
def server_info(request):
|
||||
return {'minecraft_servers': models.Server.objects.all()}
|
||||
period = models.Server.objects.all()[0].day_period()
|
||||
return {'minecraft_servers': models.Server.objects.all(),
|
||||
'first_day_period': period}
|
||||
|
@@ -54,6 +54,26 @@ class Server(models.Model):
|
||||
('login_all', 'Can login to all minecraft servers'),
|
||||
)
|
||||
|
||||
def worlds(self):
|
||||
data = cache.get('caminus-server-heartbeat-%s'%(self.id))
|
||||
if data is None:
|
||||
return {}
|
||||
return data['worlds']
|
||||
|
||||
def current_time_raw(self):
|
||||
try:
|
||||
return self.worlds()['world']['time']
|
||||
except KeyError:
|
||||
return 0
|
||||
|
||||
def current_time(self):
|
||||
now = self.current_time_raw()
|
||||
hour = ((now/1000)+8)%24
|
||||
minute = int(((now/1000.0)%1)*60)
|
||||
seconds = 0
|
||||
dt = datetime.time(hour, minute, seconds)
|
||||
return dt
|
||||
|
||||
def online_players(self):
|
||||
activeSessions = PlayerSession.objects.all().filter(end=None)
|
||||
players = []
|
||||
@@ -61,6 +81,12 @@ class Server(models.Model):
|
||||
players.append(s.player)
|
||||
return players
|
||||
|
||||
def day_period(self):
|
||||
now = self.current_time()
|
||||
if now.hour > 8 and now.hour < 17:
|
||||
return "morning"
|
||||
return "night"
|
||||
|
||||
def __unicode__(self):
|
||||
return "%s:%d"%(self.hostname, self.port)
|
||||
|
||||
@@ -112,3 +138,10 @@ class Ban(models.Model):
|
||||
|
||||
def __unicode__(self):
|
||||
return "%s: %s"%(self.player, self.reason)
|
||||
|
||||
import api.events
|
||||
def kick_banned_user(sender, instance, created, **kwargs):
|
||||
player = instance.player
|
||||
if player.isBanned():
|
||||
api.events.broadcast_server_event(api.events.KickEvent(player.mc_username, instance.reason))
|
||||
post_save.connect(kick_banned_user, sender=Ban)
|
||||
|
@@ -10,6 +10,10 @@ body {
|
||||
font-family: Verdana,Tahoma,"DejaVu Sans",sans-serif;
|
||||
}
|
||||
|
||||
body.night, body.evening {
|
||||
background-image: url(img/bg_night.png);
|
||||
}
|
||||
|
||||
.stat-box {
|
||||
padding: 1em;
|
||||
color: #fff;
|
||||
|
@@ -4,6 +4,7 @@ function pollMessages(id) {
|
||||
$('#chat-display').html('');
|
||||
$('#balance-display').html(data['user-info']['balance']);
|
||||
$(data['events']).each(function(idx, evt) {
|
||||
console.log(evt['type']);
|
||||
if (evt['type'] == "chat") {
|
||||
$('#chat-display').append("<li>"+evt['payload']['sender']+": "+evt['payload']['message']);
|
||||
} else if (evt['type'] == 'join') {
|
||||
@@ -14,6 +15,18 @@ function pollMessages(id) {
|
||||
$('#chat-display').append("<li><strong>"+evt['payload']['message']+"</strong></li>");
|
||||
} else if (evt['type'] == 'player-death') {
|
||||
$('#chat-display').append("<li><em>"+evt['payload']['player']+" died.</em></li>");
|
||||
} else if (evt['type'] == 'server-heartbeat') {
|
||||
cls = "night";
|
||||
console.log(evt['payload']['time']);
|
||||
t = new Date(evt['payload']['time']*1000);
|
||||
$('body').removeClass("morning night");
|
||||
if (t.getHours() > 8 && t.getHours() < 17) {
|
||||
cls = "morning";
|
||||
$('body').addClass("morning");
|
||||
} else {
|
||||
$('body').addClass("night");
|
||||
}
|
||||
$('#time-display').html(t.toLocaleTimeString());
|
||||
}
|
||||
});
|
||||
window.setTimeout(function() {pollMessages(data['poll-id'])}, 1);
|
||||
|
@@ -64,7 +64,7 @@ s.parentNode.insertBefore(po, s);
|
||||
|
||||
</script>
|
||||
</head>
|
||||
<body>
|
||||
<body class="{{first_day_period}}">
|
||||
<div id="wrapper" class="container_12">
|
||||
{% if not is_popup %}
|
||||
<div id="header">
|
||||
|
@@ -1,11 +1,11 @@
|
||||
{% load minecraft %}
|
||||
<div id="statbox" class="stat-box">
|
||||
<h2 class="title">World Status</h2>
|
||||
<div class="time">
|
||||
Current time: <span id="time-display"></span>
|
||||
</div>
|
||||
{% for server in minecraft_servers %}
|
||||
<h3>{{server.hostname}}:{{server.port}}</h3>
|
||||
<div class="time">
|
||||
Current time: <span id="time-display">{{server.current_time}}</span>
|
||||
</div>
|
||||
<a href="http://{{server.hostname}}/map/">Live Map</a>
|
||||
<a href="{% url minecraft.views.rules server=server.hostname port=server.port %}">Server Rules</a>
|
||||
<ul>
|
||||
|
Reference in New Issue
Block a user