def execute(self): """Join a chat conversation that you have been invited to. /JOIN [user who invited you] in [conversation you are invited to] Example: /JOIN Foo in Bar Take the user "Foo" up on their invitation and join them in the conversation "Bar". """ try: invitation = Invitation.objects.get(invitee=self.executor, inviter=self.arguments['user'], conversation__name__iexact=self.arguments['conversation_identifier']) except Invitation.DoesNotExist: raise SmircCommandException('you do not have an outstanding invitation from %s to the conversation "%s"' % (self.arguments['user'].username, self.arguments['conversation_identifier'])) try: Membership.load_membership(self.executor, invitation.conversation) except Membership.DoesNotExist: pass else: raise SmircCommandException('you are already in the conversation "%s"', invitation.conversation.name) try: Membership.load_membership(self.executor, invitation.conversation.name) except Membership.DoesNotExist: pass else: raise SmircCommandException('you are already in a different conversation named "%s"') m = Membership() m.conversation = invitation.conversation m.user = self.executor m.save() invitation.delete() return 'you have joined the conversation named "%s"' % (m.conversation.name)
def execute(self): """Create a new SMIRC conversation. Executor automatically joins the created conversation and is given operator permissions in it. /CREATE [conversation name] Example: /CREATE HelloWorld Creates a new SMIRC conversation called "HelloWorld" and automatically joins the executing user to it with full operator permissions. """ try: Conversation.validate_name(self.arguments['conversation_identifier']) except SmircRestrictedNameException as e: raise SmircCommandException(str(e)) try: m = Membership.load_membership(self.executor, self.arguments['conversation_identifier']) except Membership.DoesNotExist: c = Conversation() c.name = self.arguments['conversation_identifier'] c.save() m = Membership() m.conversation = c m.mode_operator = True m.user = self.executor m.save() return 'you have created a conversation named "%s"' % (c.name) else: raise SmircCommandException('you are already taking part in a conversation named "%s"' % (m.conversation.name))
def receive(self, data): self.raw_receive(data) logger.debug('received raw SMS message text "%s" from %s' % (self.raw_body, self.raw_phone_number)) if not AreaCode.validate_phone_number(self.raw_phone_number): raise SmircOutOfAreaException('disregarding message from outside of SMIRC service area (%s)' % (self.raw_phone_number)) if self.raw_body is None: raise SmircMessageException('disregarding null message') self.raw_body = self.raw_body.strip() if self.raw_body == '': raise SmircMessageException('disregarding empty message') try: user = UserProfile.load_user(self.raw_phone_number) self.command = SmircCommand.handle(user, self.raw_body) except User.DoesNotExist: user = None self.command = SmircCommand.handle(self.raw_phone_number, self.raw_body) if self.command: return if user is None: raise SmircMessageException('unknown sender %s. Maybe you are not registered? Please see www.smirc.com for help registering.' % (self.raw_phone_number)) conversation_match = re.match('^@(\S*)\s*(.*)', self.raw_body) if conversation_match: conversation_identifier = conversation_match.group(1) self.body = conversation_match.group(2) try: self.sender = Membership.load_membership(user, conversation_identifier) except Membership.DoesNotExist: raise SmircMessageException('you are not involved in a conversation named %s' % (conversation_identifier)) else: self.body = self.raw_body try: self.sender = Membership.objects.filter(user__id__exact=user.id).order_by('last_active').reverse()[0] except IndexError: raise SmircMessageException('you did not target a conversation, and you have no last-active (default) conversation') logger.debug('message body = "%s", target conversation = "%s" (id:%d), sender = "%s" (id:%d)' % (self.body, self.sender.conversation.name, self.sender.conversation.id, self.sender.user.username, self.sender.user.id))