OLD | NEW |
| (Empty) |
1 # -*- test-case-name: twisted.words.test -*- | |
2 # Copyright (c) 2001-2005 Twisted Matrix Laboratories. | |
3 # See LICENSE for details. | |
4 | |
5 from zope.interface import Interface, Attribute, implements | |
6 | |
7 class IProtocolPlugin(Interface): | |
8 """Interface for plugins providing an interface to a Words service | |
9 """ | |
10 | |
11 name = Attribute("A single word describing what kind of interface this is (e
g, irc or web)") | |
12 | |
13 def getFactory(realm, portal): | |
14 """Retrieve a C{twisted.internet.interfaces.IServerFactory} provider | |
15 | |
16 @param realm: An object providing C{twisted.cred.portal.IRealm} and | |
17 C{IChatService}, with which service information should be looked up. | |
18 | |
19 @param portal: An object providing C{twisted.cred.portal.IPortal}, | |
20 through which logins should be performed. | |
21 """ | |
22 | |
23 | |
24 class IGroup(Interface): | |
25 name = Attribute("A short string, unique among groups.") | |
26 | |
27 def add(user): | |
28 """Include the given user in this group. | |
29 | |
30 @type user: L{IUser} | |
31 """ | |
32 | |
33 def remove(user, reason=None): | |
34 """Remove the given user from this group. | |
35 | |
36 @type user: L{IUser} | |
37 @type reason: C{unicode} | |
38 """ | |
39 | |
40 def size(): | |
41 """Return the number of participants in this group. | |
42 | |
43 @rtype: L{twisted.internet.defer.Deferred} | |
44 @return: A Deferred which fires with an C{int} representing the the | |
45 number of participants in this group. | |
46 """ | |
47 | |
48 def receive(sender, recipient, message): | |
49 """ | |
50 Broadcast the given message from the given sender to other | |
51 users in group. | |
52 | |
53 The message is not re-transmitted to the sender. | |
54 | |
55 @param sender: L{IUser} | |
56 | |
57 @type recipient: L{IGroup} | |
58 @param recipient: This is probably a wart. Maybe it will be removed | |
59 in the future. For now, it should be the group object the message | |
60 is being delivered to. | |
61 | |
62 @param message: C{dict} | |
63 | |
64 @rtype: L{twisted.internet.defer.Deferred} | |
65 @return: A Deferred which fires with None when delivery has been | |
66 attempted for all users. | |
67 """ | |
68 | |
69 def setMetadata(meta): | |
70 """Change the metadata associated with this group. | |
71 | |
72 @type meta: C{dict} | |
73 """ | |
74 | |
75 def iterusers(): | |
76 """Return an iterator of all users in this group. | |
77 """ | |
78 | |
79 | |
80 class IChatClient(Interface): | |
81 """Interface through which IChatService interacts with clients. | |
82 """ | |
83 | |
84 name = Attribute("A short string, unique among users. This will be set by t
he L{IChatService} at login time.") | |
85 | |
86 def receive(sender, recipient, message): | |
87 """ | |
88 Callback notifying this user of the given message sent by the | |
89 given user. | |
90 | |
91 This will be invoked whenever another user sends a message to a | |
92 group this user is participating in, or whenever another user sends | |
93 a message directly to this user. In the former case, C{recipient} | |
94 will be the group to which the message was sent; in the latter, it | |
95 will be the same object as the user who is receiving the message. | |
96 | |
97 @type sender: L{IUser} | |
98 @type recipient: L{IUser} or L{IGroup} | |
99 @type message: C{dict} | |
100 | |
101 @rtype: L{twisted.internet.defer.Deferred} | |
102 @return: A Deferred which fires when the message has been delivered, | |
103 or which fails in some way. If the Deferred fails and the message | |
104 was directed at a group, this user will be removed from that group. | |
105 """ | |
106 | |
107 def groupMetaUpdate(group, meta): | |
108 """ | |
109 Callback notifying this user that the metadata for the given | |
110 group has changed. | |
111 | |
112 @type group: L{IGroup} | |
113 @type meta: C{dict} | |
114 | |
115 @rtype: L{twisted.internet.defer.Deferred} | |
116 """ | |
117 | |
118 def userJoined(group, user): | |
119 """ | |
120 Callback notifying this user that the given user has joined | |
121 the given group. | |
122 | |
123 @type group: L{IGroup} | |
124 @type user: L{IUser} | |
125 | |
126 @rtype: L{twisted.internet.defer.Deferred} | |
127 """ | |
128 | |
129 def userLeft(group, user, reason=None): | |
130 """ | |
131 Callback notifying this user that the given user has left the | |
132 given group for the given reason. | |
133 | |
134 @type group: L{IGroup} | |
135 @type user: L{IUser} | |
136 @type reason: C{unicode} | |
137 | |
138 @rtype: L{twisted.internet.defer.Deferred} | |
139 """ | |
140 | |
141 | |
142 class IUser(Interface): | |
143 """Interface through which clients interact with IChatService. | |
144 """ | |
145 | |
146 realm = Attribute("A reference to the Realm to which this user belongs. Set
if and only if the user is logged in.") | |
147 mind = Attribute("A reference to the mind which logged in to this user. Set
if and only if the user is logged in.") | |
148 name = Attribute("A short string, unique among users.") | |
149 | |
150 lastMessage = Attribute("A POSIX timestamp indicating the time of the last m
essage received from this user.") | |
151 signOn = Attribute("A POSIX timestamp indicating this user's most recent sig
n on time.") | |
152 | |
153 def loggedIn(realm, mind): | |
154 """Invoked by the associated L{IChatService} when login occurs. | |
155 | |
156 @param realm: The L{IChatService} through which login is occurring. | |
157 @param mind: The mind object used for cred login. | |
158 """ | |
159 | |
160 def send(recipient, message): | |
161 """Send the given message to the given user or group. | |
162 | |
163 @type recipient: Either L{IUser} or L{IGroup} | |
164 @type message: C{dict} | |
165 """ | |
166 | |
167 def join(group): | |
168 """Attempt to join the given group. | |
169 | |
170 @type group: L{IGroup} | |
171 @rtype: L{twisted.internet.defer.Deferred} | |
172 """ | |
173 | |
174 def leave(group): | |
175 """Discontinue participation in the given group. | |
176 | |
177 @type group: L{IGroup} | |
178 @rtype: L{twisted.internet.defer.Deferred} | |
179 """ | |
180 | |
181 def itergroups(): | |
182 """ | |
183 Return an iterator of all groups of which this user is a | |
184 member. | |
185 """ | |
186 | |
187 | |
188 class IChatService(Interface): | |
189 name = Attribute("A short string identifying this chat service (eg, a hostna
me)") | |
190 | |
191 createGroupOnRequest = Attribute( | |
192 "A boolean indicating whether L{getGroup} should implicitly " | |
193 "create groups which are requested but which do not yet exist.") | |
194 | |
195 createUserOnRequest = Attribute( | |
196 "A boolean indicating whether L{getUser} should implicitly " | |
197 "create users which are requested but which do not yet exist.") | |
198 | |
199 def itergroups(): | |
200 """Return all groups available on this service. | |
201 | |
202 @rtype: C{twisted.internet.defer.Deferred} | |
203 @return: A Deferred which fires with a list of C{IGroup} providers. | |
204 """ | |
205 | |
206 def getGroup(name): | |
207 """Retrieve the group by the given name. | |
208 | |
209 @type name: C{str} | |
210 | |
211 @rtype: L{twisted.internet.defer.Deferred} | |
212 @return: A Deferred which fires with the group with the given | |
213 name if one exists (or if one is created due to the setting of | |
214 L{createGroupOnRequest}, or which fails with | |
215 L{twisted.words.ewords.NoSuchGroup} if no such group exists. | |
216 """ | |
217 | |
218 def createGroup(name): | |
219 """Create a new group with the given name. | |
220 | |
221 @type name: C{str} | |
222 | |
223 @rtype: L{twisted.internet.defer.Deferred} | |
224 @return: A Deferred which fires with the created group, or | |
225 with fails with L{twisted.words.ewords.DuplicateGroup} if a | |
226 group by that name exists already. | |
227 """ | |
228 | |
229 def lookupGroup(name): | |
230 """Retrieve a group by name. | |
231 | |
232 Unlike C{getGroup}, this will never implicitly create a group. | |
233 | |
234 @type name: C{str} | |
235 | |
236 @rtype: L{twisted.internet.defer.Deferred} | |
237 @return: A Deferred which fires with the group by the given | |
238 name, or which fails with L{twisted.words.ewords.NoSuchGroup}. | |
239 """ | |
240 | |
241 def getUser(name): | |
242 """Retrieve the user by the given name. | |
243 | |
244 @type name: C{str} | |
245 | |
246 @rtype: L{twisted.internet.defer.Deferred} | |
247 @return: A Deferred which fires with the user with the given | |
248 name if one exists (or if one is created due to the setting of | |
249 L{createUserOnRequest}, or which fails with | |
250 L{twisted.words.ewords.NoSuchUser} if no such user exists. | |
251 """ | |
252 | |
253 def createUser(name): | |
254 """Create a new user with the given name. | |
255 | |
256 @type name: C{str} | |
257 | |
258 @rtype: L{twisted.internet.defer.Deferred} | |
259 @return: A Deferred which fires with the created user, or | |
260 with fails with L{twisted.words.ewords.DuplicateUser} if a | |
261 user by that name exists already. | |
262 """ | |
263 | |
264 __all__ = [ | |
265 'IChatInterface', 'IGroup', 'IChatClient', 'IUser', 'IChatService', | |
266 ] | |
OLD | NEW |