-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy patheventfeed.py
91 lines (74 loc) · 3.04 KB
/
eventfeed.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
from twisted.internet import protocol, reactor, defer
from mk2.plugins import Plugin
from mk2.events import PlayerChat, PlayerJoin, PlayerQuit, PlayerDeath, ServerStopped, ServerStarted
class EventFeed(Plugin):
script_cmd = Plugin.Property(required=True)
shell = Plugin.Property(default="/bin/sh")
parsable_format = Plugin.Property(default=False)
on_chat = Plugin.Property(default=True)
on_join = Plugin.Property(default=True)
on_quit = Plugin.Property(default=True)
on_death = Plugin.Property(default=True)
on_shutdown = Plugin.Property(default=True)
on_restart = Plugin.Property(default=True)
def setup(self):
if self.on_restart:
self.register(self.startup, ServerStarted)
if self.on_shutdown:
self.register(self.shutdown, ServerStopped)
if self.on_join:
self.register(self.join, PlayerJoin)
if self.on_quit:
self.register(self.quit, PlayerQuit)
if self.on_chat:
self.register(self.chat, PlayerChat)
if self.on_death:
self.register(self.death, PlayerDeath)
def startup(self, event):
if self.parsable_format:
str = " 'startup'"
else:
str = " 'Server Started'"
self.execute(self.script_cmd+str)
def shutdown(self, event):
if self.parsable_format:
str = " 'shutdown'"
else:
str = " 'Server Shut Down'"
self.execute(self.script_cmd+str)
def join(self, event):
if self.parsable_format:
str = " 'join' '" + event.username + "'"
else:
str = " '" + event.username + " joined'"
self.execute(self.script_cmd+str)
def quit(self, event):
if self.parsable_format:
str = " 'quit' '" + event.username + "'"
else:
str = " '" + event.username + " left'"
self.execute(self.script_cmd+str)
def chat(self, event):
if self.parsable_format:
str = " 'chat' '" + event.username + "' '" + event.message.replace("'", "'\\''") + "'"
else:
str = " '" + event.username + ": '" + event.message.replace("'", "'\\''") + "'"
self.execute(self.script_cmd+str)
def death(self, event):
if self.parsable_format:
str = " 'death' '" + event.username + "' '" + event.killer + "' '" + event.weapon + "' '" + event.cause + "'"
else:
str = " '" + event.text + "'"
self.execute(self.script_cmd+str)
def execute(self, cmd):
execute = defer.succeed(None)
def execute_next(fn, *a, **kw):
execute.addCallback(lambda r: fn(*a, **kw))
execute.addErrback(lambda f: True)
d = defer.Deferred()
p = protocol.ProcessProtocol()
p.outReceived = lambda d: [execute_next(self.execute_reduced, l, cmd) for l in d.split("\n")]
p.processEnded = lambda r: d.callback(None)
reactor.spawnProcess(p, self.shell, [self.shell, '-c', cmd])
d.addCallback(lambda r: execute)
return d