-
Notifications
You must be signed in to change notification settings - Fork 13
/
__init__.py
119 lines (94 loc) · 3.42 KB
/
__init__.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
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
from zope.interface import implements
from twisted.internet import defer
from twisted.application import service
from twisted.python import log, context
from twisted.cred import checkers, credentials, portal
from pottery.commands import Command
# XXX
from pottery import action
from pottery.wiring import telnet, ssh, tuiserver
from pottery import persistence, objects, epottery
def parse(transport, player, line):
def cbParse(result):
# transport.write('\r\n> ')
pass
def ebParse(err):
err.trap(epottery.NoSuchCommand)
# transport.write('Bad command or filename\r\n> ')
transport.write('Bad command or filename\r\n')
def ebAmbiguity(err):
err.trap(epottery.AmbiguousArgument)
exc = err.value
if len(exc.objects) == 0:
transport.write(getattr(err.value.action, err.value.part + "NotAvailable", "Who's that?") + "\r\n")
else:
transport.write("Could you be more specific?\r\n")
def ebUnexpected(err):
log.err(err)
# transport.write('\r\nerror\r\n> ')
transport.write('\r\nerror\r\n')
player.send(('> ', line, '\n'))
d = defer.maybeDeferred(Command.parse, player, line)
d.addCallbacks(cbParse, ebParse)
d.addErrback(ebAmbiguity)
d.addErrback(ebUnexpected)
return d
class PotteryRealm(object):
implements(portal.IRealm, checkers.ICredentialsChecker)
def __init__(self, origin):
self.players = {}
self.origin = origin
self.connected = []
def __setstate__(self, state):
self.__dict__ = state
self.connected = []
def __getstate__(self):
state = self.__dict__.copy()
del state['connected']
return state
def create(self, username, password):
p = objects.Player(username.lower())
p.realm = self
self.players[username.lower()] = (password, p)
self.connected.append(p)
self.origin.add(p)
return p
def destroy(self, player):
del self.players[player.name]
# IRealm
def requestAvatar(self, avatarId, mind, *interfaces):
player = self.players[avatarId][1]
for iface in interfaces:
asp = iface(player, None)
if asp is not None:
player.moveTo(self.origin)
self.connected.append(player)
return (iface, asp, lambda: self.connected.remove(player))
raise NotImplementedError()
# ICredentialsChecker
credentialInterfaces = (credentials.IUsernamePassword,)
def requestAvatarId(self, credentials):
u, p = credentials.username, credentials.password
u = u.lower()
try:
if self.players[u][0] == p:
return u
raise epottery.BadPassword()
except KeyError:
raise epottery.NoSuchUser()
def makeService(
place,
sshOptions = {"port": 22,
"applicationProtocolFactory": tuiserver.WidgetyServer},
telnetOptions = {"port": 23,
"applicationProtocolFactory": tuiserver.WidgetyServer}):
msvc = service.MultiService()
realm = PotteryRealm(place)
psvc = persistence.PersistenceService('popsicle', realm)
psvc.setServiceParent(msvc)
realm = psvc.realm
ssh.makeService(realm, **sshOptions
).setServiceParent(msvc)
telnet.makeService(realm, **telnetOptions
).setServiceParent(msvc)
return msvc