-
Notifications
You must be signed in to change notification settings - Fork 2
/
Copy pathmessages.py
80 lines (62 loc) · 2.3 KB
/
messages.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
from dirlock import DirLock
# import ledsign.newline, ledsign.EOM
import pickle
def initialize(filename="/var/tmp/led-messages"):
"""Sets up a new file with a messagelist in it."""
m = MessageList()
with DirLock("/tmp/messages.lock"):
with open(filename, "w") as f:
pickle.dump(m, f)
def setmsg(name, msg, filename="/var/tmp/led-messages"):
"""Sets the message named name to msg."""
with DirLock("/tmp/messages.lock"):
with open(filename, "r") as f:
m = pickle.load(f)
m.set(name, msg)
updatesign(m)
with open(filename, "w") as f:
pickle.dump(m, f)
def remove(name, filename="/var/tmp/led-messages"):
"""Remove the message named name."""
with DirLock("/tmp/messages.lock"):
with open(filename, "r") as f:
m = pickle.load(f)
m.remove(name)
updatesign(m)
with open(filename, "w") as f:
pickle.dump(m, f)
def list(filename="/var/tmp/led-messages"):
with DirLock("/tmp/messages.lock"):
with open(filename, "r") as f:
m = pickle.load(f)
for (name, msg) in m:
print((name + ": " + msg))
def updatesign(msglist):
print("Updating sign to...")
print("\\rH".join(msg for (name, msg) in msglist) + "\\r\\r\\r")
try:
import socket
sock = socket.create_connection(("localhost", 41337))
sock.send("\\rH".join(msg for (name, msg) in msglist) + "\\r\\r\\r")
finally:
sock.close()
class MessageList:
# A message list is basically an ordered dictionary
def __init__(self):
self.messagedict = dict() # Maps names to messages
self.messageorder = []
def set(self, name, msg):
assert set(self.messageorder) == set(self.messagedict.keys())
if name in list(self.messagedict.keys()):
self.messagedict[name] = msg
else:
self.messagedict[name] = msg
self.messageorder += [name]
def get(self, name):
return self.messagedict[name]
def remove(self, name):
assert set(self.messageorder) == set(self.messagedict.keys())
del self.messagedict[name]
self.messageorder.remove(name)
def __iter__(self):
return ((name, self.messagedict[name]) for name in self.messageorder)