예제 #1
0
 def build_conference_info_payload(self, irc_participants):
     irc_configuration = get_room_configuration(self.uri.split('@')[0])
     if self.conference_info_payload is None:
         settings = SIPSimpleSettings()
         conference_description = ConferenceDescription(display_text='#%s on %s' % (irc_configuration.channel, irc_configuration.server[0]), free_text='Hosted by %s' % settings.user_agent)
         host_info = HostInfo(web_page=WebPage(irc_configuration.website))
         self.conference_info_payload = Conference(self.identity.uri, conference_description=conference_description, host_info=host_info, users=Users())
     self.conference_info_payload.version = next(self.conference_info_version)
     user_count = len({str(s.remote_identity.uri) for s in self.sessions}) + len(irc_participants)
     self.conference_info_payload.conference_state = ConferenceState(user_count=user_count, active=True)
     users = Users()
     for session in self.sessions:
         try:
             user = next(user for user in users if user.entity == str(session.remote_identity.uri))
         except StopIteration:
             user = User(str(session.remote_identity.uri), display_text=session.remote_identity.display_name)
             users.add(user)
         joining_info = JoiningInfo(when=session.start_time)
         holdable_streams = [stream for stream in session.streams if stream.hold_supported]
         session_on_hold = holdable_streams and all(stream.on_hold_by_remote for stream in holdable_streams)
         hold_status = EndpointStatus('on-hold' if session_on_hold else 'connected')
         endpoint = Endpoint(str(session._invitation.remote_contact_header.uri), display_text=session.remote_identity.display_name, joining_info=joining_info, status=hold_status)
         for stream in session.streams:
             endpoint.add(Media(id(stream), media_type=format_conference_stream_type(stream)))
         user.add(endpoint)
     for nick in irc_participants:
         irc_uri = '%s@%s' % (urllib.quote(nick), irc_configuration.server[0])
         user = User(irc_uri, display_text=nick)
         users.add(user)
         endpoint = Endpoint(irc_uri, display_text=nick)
         endpoint.add(Media(random.randint(100000000, 999999999), media_type='message'))
         user.add(endpoint)
     self.conference_info_payload.users = users
     return self.conference_info_payload.toxml()
예제 #2
0
 def start(self):
     if self.state != 'stopped':
         return
     config = get_room_configuration(self.uri.split('@')[0])
     factory = IRCBotFactory(config)
     host, port = config.server
     self.irc_connector = reactor.connectTCP(host, port, factory)
     NotificationCenter().add_observer(self, sender=self.irc_connector.factory)
     self.message_dispatcher = proc.spawn(self._message_dispatcher)
     self.audio_conference = AudioConference()
     self.audio_conference.hold()
     self.state = 'started'