| 34 | | if not channel_re.match(name): |
|---|
| 35 | | raise ValueError,"Bad channel name" |
|---|
| 36 | | self.name=name |
|---|
| 37 | | self.session=session |
|---|
| 38 | | self.state=None |
|---|
| 39 | | self.room_jid=None |
|---|
| 40 | | self.config=session.network.get_channel_config(name) |
|---|
| 41 | | if self.config and self.config.encoding: |
|---|
| 42 | | self.encoding=self.config.encoding |
|---|
| 43 | | else: |
|---|
| 44 | | self.encoding=session.default_encoding |
|---|
| 45 | | self.modes={} |
|---|
| 46 | | self.users=[] |
|---|
| 47 | | self.muc=0 |
|---|
| 48 | | self.requests=RequestQueue(10) |
|---|
| | 34 | if not channel_re.match(name): |
|---|
| | 35 | raise ValueError,"Bad channel name" |
|---|
| | 36 | self.name=name |
|---|
| | 37 | self.session=session |
|---|
| | 38 | self.state=None |
|---|
| | 39 | self.room_jid=None |
|---|
| | 40 | self.config=session.network.get_channel_config(name) |
|---|
| | 41 | if self.config and self.config.encoding: |
|---|
| | 42 | self.encoding=self.config.encoding |
|---|
| | 43 | else: |
|---|
| | 44 | self.encoding=session.default_encoding |
|---|
| | 45 | self.modes={} |
|---|
| | 46 | self.users=[] |
|---|
| | 47 | self.muc=0 |
|---|
| | 48 | self.requests=RequestQueue(10) |
|---|
| 51 | | if user.channels.has_key(normalize(self.name)): |
|---|
| 52 | | if user not in self.users: |
|---|
| 53 | | self.users.append(user) |
|---|
| 54 | | else: |
|---|
| 55 | | for m in self.multiarg_modes: |
|---|
| 56 | | ul=self.modes.get(m,[]) |
|---|
| 57 | | if user in ul: |
|---|
| 58 | | ul.remove(user) |
|---|
| 59 | | if user in self.users: |
|---|
| 60 | | self.users.remove(user) |
|---|
| 61 | | self.send_notice_message(u"%s has quit" |
|---|
| 62 | | % (unicode(user.nick,self.encoding,"replace"),)) |
|---|
| 63 | | if self.state: |
|---|
| 64 | | p=self.get_user_presence(user,status=status) |
|---|
| 65 | | self.session.component.send(p) |
|---|
| | 51 | if user.channels.has_key(normalize(self.name)): |
|---|
| | 52 | if user not in self.users: |
|---|
| | 53 | self.users.append(user) |
|---|
| | 54 | else: |
|---|
| | 55 | for m in self.multiarg_modes: |
|---|
| | 56 | ul=self.modes.get(m,[]) |
|---|
| | 57 | if user in ul: |
|---|
| | 58 | ul.remove(user) |
|---|
| | 59 | if user in self.users: |
|---|
| | 60 | self.users.remove(user) |
|---|
| | 61 | self.send_notice_message(u"%s has quit" |
|---|
| | 62 | % (unicode(user.nick,self.encoding,"replace"),)) |
|---|
| | 63 | if self.state: |
|---|
| | 64 | p=self.get_user_presence(user,status=status) |
|---|
| | 65 | self.session.component.send(p) |
|---|
| 74 | | if self.state: |
|---|
| 75 | | self.debug("Channel %r not in the initial state, not joining!" % (self.name,)) |
|---|
| 76 | | p=stanza.make_error_response(stanza,"bad-request") |
|---|
| 77 | | self.session.component.send(p) |
|---|
| 78 | | return |
|---|
| 79 | | self.room_jid=stanza.get_to() |
|---|
| 80 | | self.debug("Joining channel %r" % (self.name,)) |
|---|
| 81 | | self.session.send("JOIN %s" % (self.name,)) |
|---|
| 82 | | self.requests.add("JOIN",stanza) |
|---|
| 83 | | self.state="join" |
|---|
| 84 | | if stanza.get_join_info(): |
|---|
| 85 | | self.muc=1 |
|---|
| | 74 | if self.state: |
|---|
| | 75 | self.debug("Channel %r not in the initial state, not joining!" % (self.name,)) |
|---|
| | 76 | p=stanza.make_error_response(stanza,"bad-request") |
|---|
| | 77 | self.session.component.send(p) |
|---|
| | 78 | return |
|---|
| | 79 | self.room_jid=stanza.get_to() |
|---|
| | 80 | self.debug("Joining channel %r" % (self.name,)) |
|---|
| | 81 | self.session.send("JOIN %s" % (self.name,)) |
|---|
| | 82 | self.requests.add("JOIN",stanza) |
|---|
| | 83 | self.state="join" |
|---|
| | 84 | if stanza.get_join_info(): |
|---|
| | 85 | self.muc=1 |
|---|
| 88 | | status=stanza.get_status() |
|---|
| 89 | | if not self.state: |
|---|
| 90 | | self.debug("Channel %r in the initial state - nothing to do." % (self.name,)) |
|---|
| 91 | | else: |
|---|
| 92 | | if status: |
|---|
| 93 | | self.session.send("PART %s" % (self.name,)) |
|---|
| 94 | | else: |
|---|
| 95 | | self.session.send("PART %s :%s" % (self.name, |
|---|
| 96 | | status.encode(self.encoding,"replace"))) |
|---|
| 97 | | self.state=None |
|---|
| 98 | | p=MucPresence(type="unavailable",fr=stanza.get_to(),to=stanza.get_from(),status=status) |
|---|
| 99 | | self.session.component.send(p) |
|---|
| 100 | | for u in self.users: |
|---|
| 101 | | u.leave_room(self) |
|---|
| 102 | | self.state=None |
|---|
| | 88 | status=stanza.get_status() |
|---|
| | 89 | if not self.state: |
|---|
| | 90 | self.debug("Channel %r in the initial state - nothing to do." % (self.name,)) |
|---|
| | 91 | else: |
|---|
| | 92 | if status: |
|---|
| | 93 | self.session.send("PART %s" % (self.name,)) |
|---|
| | 94 | else: |
|---|
| | 95 | self.session.send("PART %s :%s" % (self.name, |
|---|
| | 96 | status.encode(self.encoding,"replace"))) |
|---|
| | 97 | self.state=None |
|---|
| | 98 | p=MucPresence(type="unavailable",fr=stanza.get_to(),to=stanza.get_from(),status=status) |
|---|
| | 99 | self.session.component.send(p) |
|---|
| | 100 | for u in self.users: |
|---|
| | 101 | u.leave_room(self) |
|---|
| | 102 | self.state=None |
|---|
| 114 | | if self.state and user in self.users: |
|---|
| 115 | | p=MucPresence(fr=self.nick_to_jid(user.nick),to=self.session.jid) |
|---|
| 116 | | else: |
|---|
| 117 | | p=MucPresence(type="unavailable",fr=self.nick_to_jid(user.nick),to=self.session.jid) |
|---|
| 118 | | if self.muc: |
|---|
| 119 | | if user in self.modes.get("o",[]): |
|---|
| 120 | | aff="admin" |
|---|
| 121 | | role="moderator" |
|---|
| 122 | | elif user in self.modes.get("v",[]): |
|---|
| 123 | | aff="member" |
|---|
| 124 | | role="participant" |
|---|
| 125 | | elif self.modes.get("m"): |
|---|
| 126 | | aff="none" |
|---|
| 127 | | role="visitor" |
|---|
| 128 | | elif user in self.users: |
|---|
| 129 | | aff="none" |
|---|
| 130 | | role="participant" |
|---|
| 131 | | else: |
|---|
| 132 | | aff="none" |
|---|
| 133 | | role="none" |
|---|
| 134 | | ui=p.make_muc_userinfo() |
|---|
| 135 | | if nick: |
|---|
| 136 | | nick=unicode(user.nick,self.encoding,"replace") |
|---|
| 137 | | it=MucItem(aff,role,user.jid(),nick=nick,actor=actor,reason=reason) |
|---|
| 138 | | ui.add_item(it) |
|---|
| 139 | | if status: |
|---|
| 140 | | ui.add_item(MucStatus(status)) |
|---|
| 141 | | return p |
|---|
| | 114 | if self.state and user in self.users: |
|---|
| | 115 | p=MucPresence(fr=self.nick_to_jid(user.nick),to=self.session.jid) |
|---|
| | 116 | else: |
|---|
| | 117 | p=MucPresence(type="unavailable",fr=self.nick_to_jid(user.nick),to=self.session.jid) |
|---|
| | 118 | if self.muc: |
|---|
| | 119 | if user in self.modes.get("o",[]): |
|---|
| | 120 | aff="admin" |
|---|
| | 121 | role="moderator" |
|---|
| | 122 | elif user in self.modes.get("v",[]): |
|---|
| | 123 | aff="member" |
|---|
| | 124 | role="participant" |
|---|
| | 125 | elif self.modes.get("m"): |
|---|
| | 126 | aff="none" |
|---|
| | 127 | role="visitor" |
|---|
| | 128 | elif user in self.users: |
|---|
| | 129 | aff="none" |
|---|
| | 130 | role="participant" |
|---|
| | 131 | else: |
|---|
| | 132 | aff="none" |
|---|
| | 133 | role="none" |
|---|
| | 134 | ui=p.make_muc_userinfo() |
|---|
| | 135 | if nick: |
|---|
| | 136 | nick=unicode(user.nick,self.encoding,"replace") |
|---|
| | 137 | it=MucItem(aff,role,user.jid(),nick=nick,actor=actor,reason=reason) |
|---|
| | 138 | ui.add_item(it) |
|---|
| | 139 | if status: |
|---|
| | 140 | ui.add_item(MucStatus(status)) |
|---|
| | 141 | return p |
|---|
| 144 | | p_unaval=self.get_user_presence(user,nick=user.nick,status=303) |
|---|
| 145 | | p_unaval.set_type("unavailable") |
|---|
| 146 | | p_unaval.set_show(None) |
|---|
| 147 | | p_unaval.set_status(None) |
|---|
| 148 | | p_unaval.set_from(self.nick_to_jid(oldnick)) |
|---|
| 149 | | p_aval=self.get_user_presence(user,status=303) |
|---|
| 150 | | self.session.component.send(p_unaval) |
|---|
| 151 | | self.session.component.send(p_aval) |
|---|
| 152 | | self.send_notice_message(u"%s is now known as %s" |
|---|
| 153 | | % (unicode(oldnick,self.encoding,"replace"), |
|---|
| 154 | | unicode(user.nick,self.encoding,"replace"))) |
|---|
| 155 | | |
|---|
| | 144 | p_unaval=self.get_user_presence(user,nick=user.nick,status=303) |
|---|
| | 145 | p_unaval.set_type("unavailable") |
|---|
| | 146 | p_unaval.set_show(None) |
|---|
| | 147 | p_unaval.set_status(None) |
|---|
| | 148 | p_unaval.set_from(self.nick_to_jid(oldnick)) |
|---|
| | 149 | p_aval=self.get_user_presence(user,status=303) |
|---|
| | 150 | self.session.component.send(p_unaval) |
|---|
| | 151 | self.session.component.send(p_aval) |
|---|
| | 152 | self.send_notice_message(u"%s is now known as %s" |
|---|
| | 153 | % (unicode(oldnick,self.encoding,"replace"), |
|---|
| | 154 | unicode(user.nick,self.encoding,"replace"))) |
|---|
| | 155 | |
|---|
| 157 | | if mode in self.toggle_modes: |
|---|
| 158 | | self.modes[mode]=1 |
|---|
| 159 | | elif mode in self.arg_modes: |
|---|
| 160 | | self.modes[mode]=arg |
|---|
| 161 | | elif mode in self.multiarg_modes: |
|---|
| 162 | | if self.modes.has_key(mode): |
|---|
| 163 | | self.modes[mode].append(arg) |
|---|
| 164 | | else: |
|---|
| 165 | | self.modes[mode]=[arg] |
|---|
| | 157 | if mode in self.toggle_modes: |
|---|
| | 158 | self.modes[mode]=1 |
|---|
| | 159 | elif mode in self.arg_modes: |
|---|
| | 160 | self.modes[mode]=arg |
|---|
| | 161 | elif mode in self.multiarg_modes: |
|---|
| | 162 | if self.modes.has_key(mode): |
|---|
| | 163 | self.modes[mode].append(arg) |
|---|
| | 164 | else: |
|---|
| | 165 | self.modes[mode]=[arg] |
|---|
| 168 | | try: |
|---|
| 169 | | if mode in self.toggle_modes: |
|---|
| 170 | | del self.modes[mode] |
|---|
| 171 | | elif mode in self.arg_modes: |
|---|
| 172 | | del self.modes[mode] |
|---|
| 173 | | elif mode in self.multiarg_modes: |
|---|
| 174 | | if self.modes.has_key(mode): |
|---|
| 175 | | self.modes[mode].remove(arg) |
|---|
| 176 | | if not self.modes[mode]: |
|---|
| 177 | | del self.modes[mode] |
|---|
| 178 | | except (KeyError,ValueError): |
|---|
| 179 | | pass |
|---|
| | 168 | try: |
|---|
| | 169 | if mode in self.toggle_modes: |
|---|
| | 170 | del self.modes[mode] |
|---|
| | 171 | elif mode in self.arg_modes: |
|---|
| | 172 | del self.modes[mode] |
|---|
| | 173 | elif mode in self.multiarg_modes: |
|---|
| | 174 | if self.modes.has_key(mode): |
|---|
| | 175 | self.modes[mode].remove(arg) |
|---|
| | 176 | if not self.modes[mode]: |
|---|
| | 177 | del self.modes[mode] |
|---|
| | 178 | except (KeyError,ValueError): |
|---|
| | 179 | pass |
|---|
| 214 | | r=self.requests.get(requests) |
|---|
| 215 | | if r: |
|---|
| 216 | | m=r.stanza.make_error_response(condition) |
|---|
| 217 | | else: |
|---|
| 218 | | m=Message(fr=self.room_jid.bare(),to=self.session.jid, |
|---|
| 219 | | type="error", error_cond=condition) |
|---|
| 220 | | self.session.component.send(m) |
|---|
| | 214 | r=self.requests.get(requests) |
|---|
| | 215 | if r: |
|---|
| | 216 | m=r.stanza.make_error_response(condition) |
|---|
| | 217 | else: |
|---|
| | 218 | m=Message(fr=self.room_jid.bare(),to=self.session.jid, |
|---|
| | 219 | type="error", error_cond=condition) |
|---|
| | 220 | self.session.component.send(m) |
|---|
| 227 | | topic=remove_evil_characters(params[1]) |
|---|
| 228 | | m=Message(fr=self.room_jid.bare(),to=self.session.jid, |
|---|
| 229 | | type="groupchat", subject=unicode(topic,self.encoding,"replace")) |
|---|
| 230 | | self.session.component.send(m) |
|---|
| | 227 | topic=remove_evil_characters(params[1]) |
|---|
| | 228 | m=Message(fr=self.room_jid.bare(),to=self.session.jid, |
|---|
| | 229 | type="groupchat", subject=unicode(topic,self.encoding,"replace")) |
|---|
| | 230 | self.session.component.send(m) |
|---|
| 233 | | self.requests.get("TOPIC") |
|---|
| 234 | | topic=remove_evil_characters(params[1]) |
|---|
| 235 | | m=Message(fr=self.prefix_to_jid(prefix),to=self.session.jid, |
|---|
| 236 | | type="groupchat", subject=unicode(topic,self.encoding,"replace")) |
|---|
| 237 | | self.session.component.send(m) |
|---|
| 238 | | |
|---|
| | 233 | self.requests.get("TOPIC") |
|---|
| | 234 | topic=remove_evil_characters(params[1]) |
|---|
| | 235 | m=Message(fr=self.prefix_to_jid(prefix),to=self.session.jid, |
|---|
| | 236 | type="groupchat", subject=unicode(topic,self.encoding,"replace")) |
|---|
| | 237 | self.session.component.send(m) |
|---|
| | 238 | |
|---|
| 240 | | if len(params)<2: |
|---|
| 241 | | self.debug("No parameters in received MODE") |
|---|
| 242 | | return |
|---|
| 243 | | params_str=string.join(params[2:]," ").strip() |
|---|
| 244 | | if params_str: |
|---|
| 245 | | params_str=" "+params_str |
|---|
| 246 | | if "!" in prefix: |
|---|
| 247 | | nick,iuser=prefix.split("!",1) |
|---|
| 248 | | iuser="(%s)" % (iuser,) |
|---|
| 249 | | else: |
|---|
| 250 | | nick,iuser=prefix,"" |
|---|
| 251 | | self.send_notice_message(u"Mode change: [%s%s] by %s%s" |
|---|
| 252 | | % (unicode(params[1],self.encoding,"replace"), |
|---|
| 253 | | unicode(params_str,self.encoding,"replace"), |
|---|
| 254 | | unicode(nick,self.encoding,"replace"), |
|---|
| 255 | | unicode(iuser,self.encoding,"replace")), |
|---|
| 256 | | 0) |
|---|
| 257 | | if self.session.check_prefix(prefix) and len(params)>=3: |
|---|
| 258 | | r=self.requests.get("MODE",string.join(params[1:]," ")) |
|---|
| 259 | | if r: |
|---|
| 260 | | reply=r.stanza.make_result_response() |
|---|
| 261 | | self.session.component.send(reply) |
|---|
| 262 | | self.irc_mode_changed(prefix,command,params) |
|---|
| | 240 | if len(params)<2: |
|---|
| | 241 | self.debug("No parameters in received MODE") |
|---|
| | 242 | return |
|---|
| | 243 | params_str=string.join(params[2:]," ").strip() |
|---|
| | 244 | if params_str: |
|---|
| | 245 | params_str=" "+params_str |
|---|
| | 246 | if "!" in prefix: |
|---|
| | 247 | nick,iuser=prefix.split("!",1) |
|---|
| | 248 | iuser="(%s)" % (iuser,) |
|---|
| | 249 | else: |
|---|
| | 250 | nick,iuser=prefix,"" |
|---|
| | 251 | self.send_notice_message(u"Mode change: [%s%s] by %s%s" |
|---|
| | 252 | % (unicode(params[1],self.encoding,"replace"), |
|---|
| | 253 | unicode(params_str,self.encoding,"replace"), |
|---|
| | 254 | unicode(nick,self.encoding,"replace"), |
|---|
| | 255 | unicode(iuser,self.encoding,"replace")), |
|---|
| | 256 | 0) |
|---|
| | 257 | if self.session.check_prefix(prefix) and len(params)>=3: |
|---|
| | 258 | r=self.requests.get("MODE",string.join(params[1:]," ")) |
|---|
| | 259 | if r: |
|---|
| | 260 | reply=r.stanza.make_result_response() |
|---|
| | 261 | self.session.component.send(reply) |
|---|
| | 262 | self.irc_mode_changed(prefix,command,params) |
|---|
| 265 | | actor=self.session.get_user(prefix) |
|---|
| 266 | | modes=params[1] |
|---|
| 267 | | params=params[2:] |
|---|
| 268 | | pm=None |
|---|
| 269 | | for m in modes: |
|---|
| 270 | | if m in "+-": |
|---|
| 271 | | pm=m |
|---|
| 272 | | continue |
|---|
| 273 | | elif not pm: |
|---|
| 274 | | self.debug("Not '+' or '-' before '%s' in received MODE" % (m,)) |
|---|
| 275 | | continue |
|---|
| 276 | | elif m in self.arg_modes or m in self.multiarg_modes: |
|---|
| 277 | | if not len(params): |
|---|
| 278 | | self.debug("No argument for mode '%s' in received MODE" % (m,)) |
|---|
| 279 | | continue |
|---|
| 280 | | arg=params.pop(0) |
|---|
| 281 | | elif m in self.toggle_modes: |
|---|
| 282 | | arg=None |
|---|
| 283 | | else: |
|---|
| 284 | | self.debug("Unknown mode '%s' in received MODE" % (m,)) |
|---|
| 285 | | continue |
|---|
| 286 | | if m in "oOv": |
|---|
| 287 | | arg=self.session.get_user(arg) |
|---|
| 288 | | if not arg: |
|---|
| 289 | | continue |
|---|
| 290 | | if pm=="+": |
|---|
| 291 | | self.set_mode(m,arg) |
|---|
| 292 | | else: |
|---|
| 293 | | self.reset_mode(m,arg) |
|---|
| 294 | | if m in "oOv": |
|---|
| 295 | | self.user_mode_changed(arg,actor,m) |
|---|
| 296 | | elif m=="m": |
|---|
| 297 | | for u in self.users: |
|---|
| 298 | | self.sync_user(u) |
|---|
| | 265 | actor=self.session.get_user(prefix) |
|---|
| | 266 | modes=params[1] |
|---|
| | 267 | params=params[2:] |
|---|
| | 268 | pm=None |
|---|
| | 269 | for m in modes: |
|---|
| | 270 | if m in "+-": |
|---|
| | 271 | pm=m |
|---|
| | 272 | continue |
|---|
| | 273 | elif not pm: |
|---|
| | 274 | self.debug("Not '+' or '-' before '%s' in received MODE" % (m,)) |
|---|
| | 275 | continue |
|---|
| | 276 | elif m in self.arg_modes or m in self.multiarg_modes: |
|---|
| | 277 | if not len(params): |
|---|
| | 278 | self.debug("No argument for mode '%s' in received MODE" % (m,)) |
|---|
| | 279 | continue |
|---|
| | 280 | arg=params.pop(0) |
|---|
| | 281 | elif m in self.toggle_modes: |
|---|
| | 282 | arg=None |
|---|
| | 283 | else: |
|---|
| | 284 | self.debug("Unknown mode '%s' in received MODE" % (m,)) |
|---|
| | 285 | continue |
|---|
| | 286 | if m in "oOv": |
|---|
| | 287 | arg=self.session.get_user(arg) |
|---|
| | 288 | if not arg: |
|---|
| | 289 | continue |
|---|
| | 290 | if pm=="+": |
|---|
| | 291 | self.set_mode(m,arg) |
|---|
| | 292 | else: |
|---|
| | 293 | self.reset_mode(m,arg) |
|---|
| | 294 | if m in "oOv": |
|---|
| | 295 | self.user_mode_changed(arg,actor,m) |
|---|
| | 296 | elif m=="m": |
|---|
| | 297 | for u in self.users: |
|---|
| | 298 | self.sync_user(u) |
|---|
| 301 | | if actor: |
|---|
| 302 | | actor_jid=self.nick_to_jid(actor.nick) |
|---|
| 303 | | else: |
|---|
| 304 | | actor_jid=None |
|---|
| 305 | | p=self.get_user_presence(user,actor_jid) |
|---|
| 306 | | if actor: |
|---|
| 307 | | by=u" by %s" % (unicode(actor.nick,self.encoding,"replace"),) |
|---|
| 308 | | else: |
|---|
| 309 | | by=u"" |
|---|
| 310 | | self.session.component.send(p) |
|---|
| 311 | | if mode=="v": |
|---|
| 312 | | self.send_notice_message(u"%s was granted voice%s" |
|---|
| 313 | | % (unicode(user.nick,self.encoding,"replace"),by)) |
|---|
| 314 | | elif mode=="o": |
|---|
| 315 | | self.send_notice_message(u"%s was granted operator status%s" |
|---|
| 316 | | % (unicode(user.nick,self.encoding,"replace"),by)) |
|---|
| 317 | | elif mode=="O": |
|---|
| 318 | | self.send_notice_message(u"%s was granted got owner status%s" |
|---|
| 319 | | % (unicode(user.nick,self.encoding,"replace"),by)) |
|---|
| | 301 | if actor: |
|---|
| | 302 | actor_jid=self.nick_to_jid(actor.nick) |
|---|
| | 303 | else: |
|---|
| | 304 | actor_jid=None |
|---|
| | 305 | p=self.get_user_presence(user,actor_jid) |
|---|
| | 306 | if actor: |
|---|
| | 307 | by=u" by %s" % (unicode(actor.nick,self.encoding,"replace"),) |
|---|
| | 308 | else: |
|---|
| | 309 | by=u"" |
|---|
| | 310 | self.session.component.send(p) |
|---|
| | 311 | if mode=="v": |
|---|
| | 312 | self.send_notice_message(u"%s was granted voice%s" |
|---|
| | 313 | % (unicode(user.nick,self.encoding,"replace"),by)) |
|---|
| | 314 | elif mode=="o": |
|---|
| | 315 | self.send_notice_message(u"%s was granted operator status%s" |
|---|
| | 316 | % (unicode(user.nick,self.encoding,"replace"),by)) |
|---|
| | 317 | elif mode=="O": |
|---|
| | 318 | self.send_notice_message(u"%s was granted got owner status%s" |
|---|
| | 319 | % (unicode(user.nick,self.encoding,"replace"),by)) |
|---|
| 322 | | nprefix=normalize(prefix) |
|---|
| 323 | | nnick=normalize(self.session.nick) |
|---|
| 324 | | if nprefix==nnick or nprefix.startswith(nnick+"!"): |
|---|
| 325 | | if self.state=="join": |
|---|
| 326 | | self.debug("Channel %r joined!" % (self.name,)) |
|---|
| 327 | | self.session.user.sync_delay+=1 |
|---|
| 328 | | try: |
|---|
| 329 | | self.session.user.join_channel(self) |
|---|
| 330 | | finally: |
|---|
| 331 | | self.session.user.sync_delay-=1 |
|---|
| 332 | | self.state="joined" |
|---|
| 333 | | self.requests.get("JOIN") |
|---|
| 334 | | self.session.send("MODE %s" % (self.name,)) |
|---|
| 335 | | self.session.send("WHO %s" % (self.name,)) |
|---|
| 336 | | else: |
|---|
| 337 | | user=self.session.get_user(prefix) |
|---|
| 338 | | user.join_channel(self) |
|---|
| 339 | | self.send_notice_message(u"%s has joined" |
|---|
| 340 | | % (unicode(user.nick,self.encoding,"replace"),)) |
|---|
| 341 | | self.session.send("WHO %s" % (user.nick,)) |
|---|
| | 322 | nprefix=normalize(prefix) |
|---|
| | 323 | nnick=normalize(self.session.nick) |
|---|
| | 324 | if nprefix==nnick or nprefix.startswith(nnick+"!"): |
|---|
| | 325 | if self.state=="join": |
|---|
| | 326 | self.debug("Channel %r joined!" % (self.name,)) |
|---|
| | 327 | self.session.user.sync_delay+=1 |
|---|
| | 328 | try: |
|---|
| | 329 | self.session.user.join_channel(self) |
|---|
| | 330 | finally: |
|---|
| | 331 | self.session.user.sync_delay-=1 |
|---|
| | 332 | self.state="joined" |
|---|
| | 333 | self.requests.get("JOIN") |
|---|
| | 334 | self.session.send("MODE %s" % (self.name,)) |
|---|
| | 335 | self.session.send("WHO %s" % (self.name,)) |
|---|
| | 336 | else: |
|---|
| | 337 | user=self.session.get_user(prefix) |
|---|
| | 338 | user.join_channel(self) |
|---|
| | 339 | self.send_notice_message(u"%s has joined" |
|---|
| | 340 | % (unicode(user.nick,self.encoding,"replace"),)) |
|---|
| | 341 | self.session.send("WHO %s" % (user.nick,)) |
|---|
| 356 | | try: |
|---|
| 357 | | self.users.remove(user) |
|---|
| 358 | | except ValueError: |
|---|
| 359 | | pass |
|---|
| 360 | | self.send_notice_message(u"%s was kicked by %s" |
|---|
| 361 | | % (unicode(user.descr(),self.encoding,"replace"), |
|---|
| 362 | | unicode(actor.descr(),self.encoding,"replace")), |
|---|
| 363 | | 0) |
|---|
| 364 | | user.leave_channel(self,status=307) |
|---|
| 365 | | if user and self.session.check_prefix(prefix): |
|---|
| 366 | | r=self.requests.get("KICK",user.nick) |
|---|
| 367 | | if r: |
|---|
| 368 | | iq=r.stanza.make_result_response() |
|---|
| 369 | | self.session.component.send(iq) |
|---|
| | 356 | try: |
|---|
| | 357 | self.users.remove(user) |
|---|
| | 358 | except ValueError: |
|---|
| | 359 | pass |
|---|
| | 360 | self.send_notice_message(u"%s was kicked by %s" |
|---|
| | 361 | % (unicode(user.descr(),self.encoding,"replace"), |
|---|
| | 362 | unicode(actor.descr(),self.encoding,"replace")), |
|---|
| | 363 | 0) |
|---|
| | 364 | user.leave_channel(self,status=307) |
|---|
| | 365 | if user and self.session.check_prefix(prefix): |
|---|
| | 366 | r=self.requests.get("KICK",user.nick) |
|---|
| | 367 | if r: |
|---|
| | 368 | iq=r.stanza.make_result_response() |
|---|
| | 369 | self.session.component.send(iq) |
|---|
| 378 | | if not self.state or len(params)<2: |
|---|
| 379 | | self.debug("ignoring it") |
|---|
| 380 | | return |
|---|
| 381 | | body=unicode(params[1],self.encoding,"replace") |
|---|
| 382 | | if body[0]=="\001" and body[-1]=="\001": |
|---|
| 383 | | self.CTCP(prefix,body[1:-1]) |
|---|
| 384 | | else: |
|---|
| 385 | | m=Message(type="groupchat",fr=self.prefix_to_jid(prefix),to=self.session.jid, |
|---|
| 386 | | body=remove_evil_characters(strip_colors(body))) |
|---|
| 387 | | self.session.component.send(m) |
|---|
| 388 | | |
|---|
| | 378 | if not self.state or len(params)<2: |
|---|
| | 379 | self.debug("ignoring it") |
|---|
| | 380 | return |
|---|
| | 381 | body=unicode(params[1],self.encoding,"replace") |
|---|
| | 382 | if body[0]=="\001" and body[-1]=="\001": |
|---|
| | 383 | self.CTCP(prefix,body[1:-1]) |
|---|
| | 384 | else: |
|---|
| | 385 | m=Message(type="groupchat",fr=self.prefix_to_jid(prefix),to=self.session.jid, |
|---|
| | 386 | body=remove_evil_characters(strip_colors(body))) |
|---|
| | 387 | self.session.component.send(m) |
|---|
| | 388 | |
|---|
| 390 | | if " " in command: |
|---|
| 391 | | command,arg=command.split(" ",1) |
|---|
| 392 | | else: |
|---|
| 393 | | arg=None |
|---|
| 394 | | if command=="ACTION": |
|---|
| 395 | | m=Message(type="groupchat",fr=self.prefix_to_jid(prefix),to=self.session.jid, |
|---|
| 396 | | body="/me "+remove_evil_characters(strip_colors(arg))) |
|---|
| 397 | | self.session.component.send(m) |
|---|
| 398 | | else: |
|---|
| 399 | | self.debug("Unknown CTCP command: %r %r" % (command,arg)) |
|---|
| | 390 | if " " in command: |
|---|
| | 391 | command,arg=command.split(" ",1) |
|---|
| | 392 | else: |
|---|
| | 393 | arg=None |
|---|
| | 394 | if command=="ACTION": |
|---|
| | 395 | m=Message(type="groupchat",fr=self.prefix_to_jid(prefix),to=self.session.jid, |
|---|
| | 396 | body="/me "+remove_evil_characters(strip_colors(arg))) |
|---|
| | 397 | self.session.component.send(m) |
|---|
| | 398 | else: |
|---|
| | 399 | self.debug("Unknown CTCP command: %r %r" % (command,arg)) |
|---|
| 402 | | topic=topic.encode(self.encoding,"replace") |
|---|
| 403 | | topic=topic.replace("\n"," ").replace("\r"," ") |
|---|
| 404 | | self.session.send("TOPIC %s :%s" % (self.name,topic)) |
|---|
| 405 | | self.requests.add("TOPIC",stanza) |
|---|
| | 402 | topic=topic.encode(self.encoding,"replace") |
|---|
| | 403 | topic=topic.replace("\n"," ").replace("\r"," ") |
|---|
| | 404 | self.session.send("TOPIC %s :%s" % (self.name,topic)) |
|---|
| | 405 | self.requests.add("TOPIC",stanza) |
|---|
| 408 | | nick=nick.encode(self.encoding,"strict") |
|---|
| 409 | | self.session.send("KICK %s %s :%s" % (self.name,nick,reason)) |
|---|
| 410 | | self.requests.add("KICK",stanza,nick) |
|---|
| 411 | | |
|---|
| | 408 | nick=nick.encode(self.encoding,"strict") |
|---|
| | 409 | self.session.send("KICK %s %s :%s" % (self.name,nick,reason)) |
|---|
| | 410 | self.requests.add("KICK",stanza,nick) |
|---|
| | 411 | |
|---|
| 413 | | nick=nick.encode(self.encoding,"strict") |
|---|
| 414 | | user=self.session.users.get(normalize(nick)) |
|---|
| 415 | | if not user in self.users: |
|---|
| 416 | | r=stanza.make_error_response("item-not-found") |
|---|
| 417 | | self.session.component.send(r) |
|---|
| 418 | | return |
|---|
| 419 | | if user in self.modes.get("o",[]): |
|---|
| 420 | | r=stanza.make_result_response() |
|---|
| 421 | | self.session.component.send(r) |
|---|
| 422 | | return |
|---|
| 423 | | if user in self.modes.get("v",[]): |
|---|
| 424 | | change="-v+o %s %s" % (nick,nick) |
|---|
| 425 | | else: |
|---|
| 426 | | change="+o "+nick |
|---|
| 427 | | self.session.send("MODE %s %s" % (self.name,change)) |
|---|
| 428 | | self.requests.add("MODE",stanza,change) |
|---|
| | 413 | nick=nick.encode(self.encoding,"strict") |
|---|
| | 414 | user=self.session.users.get(normalize(nick)) |
|---|
| | 415 | if not user in self.users: |
|---|
| | 416 | r=stanza.make_error_response("item-not-found") |
|---|
| | 417 | self.session.component.send(r) |
|---|
| | 418 | return |
|---|
| | 419 | if user in self.modes.get("o",[]): |
|---|
| | 420 | r=stanza.make_result_response() |
|---|
| | 421 | self.session.component.send(r) |
|---|
| | 422 | return |
|---|
| | 423 | if user in self.modes.get("v",[]): |
|---|
| | 424 | change="-v+o %s %s" % (nick,nick) |
|---|
| | 425 | else: |
|---|
| | 426 | change="+o "+nick |
|---|
| | 427 | self.session.send("MODE %s %s" % (self.name,change)) |
|---|
| | 428 | self.requests.add("MODE",stanza,change) |
|---|
| 431 | | nick=nick.encode(self.encoding,"strict") |
|---|
| 432 | | user=self.session.users.get(normalize(nick)) |
|---|
| 433 | | if not user in self.users: |
|---|
| 434 | | r=stanza.make_error_response("item-not-found") |
|---|
| 435 | | self.session.component.send(r) |
|---|
| 436 | | return |
|---|
| 437 | | if user in self.modes.get("v",[]): |
|---|
| 438 | | r=stanza.make_result_response() |
|---|
| 439 | | self.session.component.send(r) |
|---|
| 440 | | return |
|---|
| 441 | | if user in self.modes.get("o",[]): |
|---|
| 442 | | change="-o+v %s %s" % (nick,nick) |
|---|
| 443 | | else: |
|---|
| 444 | | change="+v "+nick |
|---|
| 445 | | self.session.send("MODE %s %s" % (self.name,change)) |
|---|
| 446 | | self.requests.add("MODE",stanza,change) |
|---|
| | 431 | nick=nick.encode(self.encoding,"strict") |
|---|
| | 432 | user=self.session.users.get(normalize(nick)) |
|---|
| | 433 | if not user in self.users: |
|---|
| | 434 | r=stanza.make_error_response("item-not-found") |
|---|
| | 435 | self.session.component.send(r) |
|---|
| | 436 | return |
|---|
| | 437 | if user in self.modes.get("v",[]): |
|---|
| | 438 | r=stanza.make_result_response() |
|---|
| | 439 | self.session.component.send(r) |
|---|
| | 440 | return |
|---|
| | 441 | if user in self.modes.get("o",[]): |
|---|
| | 442 | change="-o+v %s %s" % (nick,nick) |
|---|
| | 443 | else: |
|---|
| | 444 | change="+v "+nick |
|---|
| | 445 | self.session.send("MODE %s %s" % (self.name,change)) |
|---|
| | 446 | self.requests.add("MODE",stanza,change) |
|---|
| 449 | | nick=nick.encode(self.encoding,"strict") |
|---|
| 450 | | user=self.session.users.get(normalize(nick)) |
|---|
| 451 | | if not user in self.users: |
|---|
| 452 | | r=stanza.make_error_response("item-not-found") |
|---|
| 453 | | self.session.component.send(r) |
|---|
| 454 | | return |
|---|
| 455 | | if user in self.modes.get("v",[]) and user in self.modes.get("o",[]): |
|---|
| 456 | | change="-o-v %s %s" % (nick,nick) |
|---|
| 457 | | elif user in self.modes.get("o",[]): |
|---|
| 458 | | change="-o "+nick |
|---|
| 459 | | elif user in self.modes.get("v",[]): |
|---|
| 460 | | change="-v "+nick |
|---|
| 461 | | else: |
|---|
| 462 | | r=stanza.make_result_response() |
|---|
| 463 | | self.session.component.send(r) |
|---|
| 464 | | return |
|---|
| 465 | | self.session.send("MODE %s %s" % (self.name,change)) |
|---|
| 466 | | self.requests.add("MODE",stanza,change) |
|---|
| | 449 | nick=nick.encode(self.encoding,"strict") |
|---|
| | 450 | user=self.session.users.get(normalize(nick)) |
|---|
| | 451 | if not user in self.users: |
|---|
| | 452 | r=stanza.make_error_response("item-not-found") |
|---|
| | 453 | self.session.component.send(r) |
|---|
| | 454 | return |
|---|
| | 455 | if user in self.modes.get("v",[]) and user in self.modes.get("o",[]): |
|---|
| | 456 | change="-o-v %s %s" % (nick,nick) |
|---|
| | 457 | elif user in self.modes.get("o",[]): |
|---|
| | 458 | change="-o "+nick |
|---|
| | 459 | elif user in self.modes.get("v",[]): |
|---|
| | 460 | change="-v "+nick |
|---|
| | 461 | else: |
|---|
| | 462 | r=stanza.make_result_response() |
|---|
| | 463 | self.session.component.send(r) |
|---|
| | 464 | return |
|---|
| | 465 | self.session.send("MODE %s %s" % (self.name,change)) |
|---|
| | 466 | self.requests.add("MODE",stanza,change) |
|---|