def updateEncryptionLock(self, msgid, encryption=None): if encryption is None: return if encryption == '': lock_icon_path = Resources.get('unlocked-darkgray.png') else: lock_icon_path = Resources.get('locked-green.png' if encryption == 'verified' else 'locked-red.png') script = "updateEncryptionLock('%s','%s')" % (msgid, lock_icon_path) self.executeJavaScript(script)
def updateEncryptionLock(self, msgid, encryption=None): if encryption is None: return if encryption == '': lock_icon_path = Resources.get('unlocked-darkgray.png') else: lock_icon_path = Resources.get('locked-green.png' if encryption == 'verified' else 'locked-red.png') script = "updateEncryptionLock('%s','%s')" % (msgid, lock_icon_path) self.executeJavaScript(script)
def load_assets(self): # Load the circle loading animation Resources.add("loading", pygame.image.load("assets/loading.png")) self.circle_image = Resources.get("loading") # Load the settings gear icon Resources.add("gear", pygame.image.load("assets/gear.png")) # Load the close icon Resources.add("close", pygame.image.load("assets/close.png")) # Load the coin image Resources.add("coin", pygame.image.load("assets/coin.png")) # Load the random pen image Resources.add("random_pen", pygame.image.load("assets/random_pen.png")) # Load the pen data and images Resources.add("all_pens", Resources.load_text("assets/pens.json")) Resources.add("pencil", pygame.image.load("assets/pencil.png")) Resources.add("ball_pen", pygame.image.load("assets/ball_pen.png")) Resources.add("blue_gel_pen", pygame.image.load("assets/blue_gel_pen.png")) Resources.add("black_gel_pen", pygame.image.load("assets/black_gel_pen.png")) Resources.add("mech_pencil", pygame.image.load("assets/mech_pencil.png")) Resources.add("marker", pygame.image.load("assets/marker.png")) self.loaded = True
def __init__(self, session, audio_stream): self.session = session self.stream = audio_stream self.start_time = None notification_center = NotificationCenter() notification_center.add_observer(self, sender=self.stream) self.beep = WavePlayer(SIPApplication.voice_audio_mixer, Resources.get('answering_machine_tone.wav')) notification_center.add_observer(self, sender=self.beep) message_wav = SIPSimpleSettings().answering_machine.unavailable_message if message_wav: self.unavailable_message = WavePlayer( SIPApplication.voice_audio_mixer, message_wav.sound_file.path, message_wav.sound_file.volume, 1, 2, False) notification_center.add_observer(self, sender=self.unavailable_message) self.stream.bridge.add(self.unavailable_message) else: self.unavailable_message = None self.stream.bridge.add(self.beep) self.stream.device.input_muted = True
def start(self, screen): if not self.already_loaded: AIData.load_all_ais(Resources.get("all_ai")) self.width, self.height = screen.get_width(), screen.get_height() self.turn_text = Label( pygame.Rect(10, 10, 100, 30), "", { Options.BACKGROUND: (0, 51, 102), Options.FOREGROUND: (255, 255, 255), Options.BORDER_WIDTH: 0, }) self.victory_text = Label( pygame.Rect(self.width / 2 - 100, self.height / 2 - 30, 200, 60), "", { Options.FONT: pygame.font.SysFont("Comic Sans MS", 25), Options.BACKGROUND: (0, 51, 102), Options.FOREGROUND: (255, 255, 255), Options.BORDER_WIDTH: 0, }) self.reset_game_data() self.already_loaded = True if GameScene.game_over: self.reset_game_data()
def reset_game_data(self): GameScene.game_over = False self.world = World((0, 0)) world_center = screen_to_world((self.width / 2, self.height / 2)) table_size = screen_to_world((1200, 600)) self.table = Table(world_center, table_size, self.world) self.players = [ Pen(PenData.current_pen, (world_center[0] - 35, world_center[1]), self.table.body, self.world), Pen(PenData.current_enemy_pen, (world_center[0] + 35, world_center[1]), self.table.body, self.world) ] self.ai_counter = GameScene.ENEMY_MOVE_DELAY self.turn_count = 0 self.move_made = True self.current_player_index = 1 self.victory_state = -1 self.player_sprites = { p: PenSprite(Resources.get(p.data.image_file)) for p in self.players } self.next_turn()
def play_hangup(self): settings = SIPSimpleSettings() if settings.audio.silent: return if time.time() - self.last_hangup_tone_time > HANGUP_TONE_THROTLE_DELAY: hangup_tone = WavePlayer(SIPApplication.voice_audio_mixer, Resources.get('hangup_tone.wav'), volume=30) NotificationCenter().add_observer(self, sender=hangup_tone, name="WavePlayerDidEnd") SIPApplication.voice_audio_bridge.add(hangup_tone) hangup_tone.start() self.last_hangup_tone_time = time.time()
def showMessage(self, call_id, msgid, direction, sender, icon_path, text, timestamp, is_html=False, state='', recipient='', is_private=False, history_entry=False, media_type='chat', encryption=None): lock_icon_path = '' if encryption is not None: if encryption == '': lock_icon_path = Resources.get('unlocked-darkgray.png') else: lock_icon_path = Resources.get('locked-green.png' if encryption == 'verified' else 'locked-red.png') if not history_entry and not self.delegate.isOutputFrameVisible(): self.delegate.showChatViewWhileVideoActive() # keep track of rendered messages to toggle the smileys or search their content later rendered_message = ChatMessageObject(call_id, msgid, text, is_html, timestamp, media_type) self.rendered_messages.append(rendered_message) if timestamp.date() != datetime.date.today(): displayed_timestamp = time.strftime("%F %T", time.localtime(calendar.timegm(timestamp.utctimetuple()))) else: displayed_timestamp = time.strftime("%T", time.localtime(calendar.timegm(timestamp.utctimetuple()))) text = processHTMLText(text, self.expandSmileys, is_html) private = 1 if is_private else "null" if is_private and recipient: label = 'Private message to %s' % cgi.escape(recipient) if direction == 'outgoing' else 'Private message from %s' % cgi.escape(sender) else: if hasattr(self.delegate, "sessionController"): label = cgi.escape(self.delegate.sessionController.nickname or self.account.display_name or self.account.id) if sender is None else cgi.escape(sender) else: label = cgi.escape(self.account.display_name or self.account.id) if sender is None else cgi.escape(sender) script = """renderMessage('%s', '%s', '%s', '%s', "%s", '%s', '%s', %s, '%s')""" % (msgid, direction, label, icon_path, text, displayed_timestamp, state, private, lock_icon_path) if self.finishedLoading: self.executeJavaScript(script) else: self.messageQueue.append(script) if hasattr(self.delegate, "chatViewDidGetNewMessage_"): self.delegate.chatViewDidGetNewMessage_(self)
def start(self, screen): if not self.already_loaded: width = screen.get_width() height = screen.get_height() self.header = Label(pygame.Rect(width / 2 - 75, height * 1 / 5 + 10, 150, 50), "Game Paused", options={ Options.BACKGROUND: (20, 61, 89), Options.FOREGROUND: (244, 180, 26), Options.BORDER_WIDTH: 0, }) self.back_btn = Button( pygame.Rect(width * 1 / 5 + 10, height * 1 / 5 + 10, 60, 40), "Back", { Options.BORDER_WIDTH: 0, Options.BACKGROUND: (20, 61, 89), Options.FOREGROUND: (244, 180, 26), Options.HOVERED_BACKGROUND: (10, 30, 45), Options.FONT: pygame.font.SysFont("Comic Sans MS", 15) }) self.forfeit_btn = Button( pygame.Rect(width / 2 - 75, height / 2, 150, 40), "Forfeit", { Options.BORDER_WIDTH: 0, Options.BACKGROUND: (20, 61, 89), Options.FOREGROUND: (244, 180, 26), Options.HOVERED_BACKGROUND: (10, 30, 45), Options.FONT: pygame.font.SysFont("Comic Sans MS", 25) }) settings_gear_image = Resources.get("gear") settings_gear_rect = pygame.rect.Rect(width * 4 / 5 - 100, height * 4 / 5 - 100, 75, 75) self.settings_btn = Image( settings_gear_rect, settings_gear_image, { Options.BACKGROUND: (20, 61, 89), Options.HOVERED_BACKGROUND: (10, 30, 45) }) self.already_loaded = True if self.last_scene_id != Scene.scene_stack[-2]: self.last_scene_id = Scene.scene_stack[-2] self.underlay_screen = screen.copy() dark_cover = pygame.Surface( self.underlay_screen.get_size()).convert_alpha( self.underlay_screen) dark_cover.fill((0, 0, 0, 0.6 * 255)) self.underlay_screen.blit(dark_cover, (0, 0))
def init_configurations(self): account_manager = AccountManager() settings = SIPSimpleSettings() self.notification_center.add_observer(self, sender=settings) # fixup default account self._selected_account = account_manager.default_account if self._selected_account is None: self._selected_account = account_manager.get_accounts()[0] default_ca = open(Resources.get('ca.crt'), "r").read().strip() self.set_default_certificate_authority(default_ca)
def init_configurations(self): account_manager = AccountManager() settings = SIPSimpleSettings() self.notification_center.add_observer(self, sender=settings) # fixup default account self._selected_account = account_manager.default_account if self._selected_account is None: self._selected_account = account_manager.get_accounts()[0] default_ca = open(Resources.get('ca.crt'), "r").read().strip() self.set_default_certificate_authority(default_ca)
def init_configurations(self): account_manager = AccountManager() settings = SIPSimpleSettings() # fixup default account self._selected_account = account_manager.default_account if self._selected_account is None: self._selected_account = account_manager.get_accounts()[0] # save default ca if needed ca = open(Resources.get('ca.crt'), "r").read().strip() try: X509Certificate(ca) except GNUTLSError, e: BlinkLogger().log_error(u"Invalid Certificate Authority: %s" % e) return
def play_hangup(self): settings = SIPSimpleSettings() if settings.audio.silent: return if time.time( ) - self.last_hangup_tone_time > HANGUP_TONE_THROTLE_DELAY: hangup_tone = WavePlayer(SIPApplication.voice_audio_mixer, Resources.get('hangup_tone.wav'), volume=30) NotificationCenter().add_observer(self, sender=hangup_tone, name="WavePlayerDidEnd") SIPApplication.voice_audio_bridge.add(hangup_tone) hangup_tone.start() self.last_hangup_tone_time = time.time()
def __init__(self, session, audio_stream): self.session = session self.stream = audio_stream self.start_time = None notification_center = NotificationCenter() notification_center.add_observer(self, sender=self.stream) self.beep = WavePlayer(SIPApplication.voice_audio_mixer, Resources.get('answering_machine_tone.wav')) notification_center.add_observer(self, sender=self.beep) message_wav = SIPSimpleSettings().answering_machine.unavailable_message if message_wav: self.unavailable_message = WavePlayer(SIPApplication.voice_audio_mixer, message_wav.sound_file.path, message_wav.sound_file.volume, 1, 2, False) notification_center.add_observer(self, sender=self.unavailable_message) self.stream.bridge.add(self.unavailable_message) else: self.unavailable_message = None self.stream.bridge.add(self.beep) self.stream.device.input_muted = True
def init_configurations(self): account_manager = AccountManager() settings = SIPSimpleSettings() # fixup default account self._selected_account = account_manager.default_account if self._selected_account is None: self._selected_account = account_manager.get_accounts()[0] # save default ca if needed ca = open(Resources.get('ca.crt'), "r").read().strip() try: X509Certificate(ca) except GNUTLSError as e: BlinkLogger().log_error("Invalid Certificate Authority: %s" % e) return tls_folder = ApplicationData.get('tls') if not os.path.exists(tls_folder): os.mkdir(tls_folder, 0o700) ca_path = os.path.join(tls_folder, 'ca.crt') try: existing_cas = open(ca_path, "r").read().strip() except Exception: existing_cas = None if ca == existing_cas: return with open(ca_path, "wb") as f: os.chmod(ca_path, 0o600) f.write(ca.encode()) BlinkLogger().log_debug("Added default Certificate Authority to %s" % ca_path) settings.tls.ca_list = ca_path settings.save()
def start(self, screen): if self.already_loaded: return width = screen.get_width() height = screen.get_height() self.title = Label(pygame.rect.Rect(width / 2 - 200, height / 7, 400, 60), "Python Penfight!", options={ Options.BACKGROUND: (20, 61, 89), Options.FOREGROUND: (244, 180, 26), Options.BORDER_WIDTH: 4, Options.FONT: pygame.font.SysFont("Comic Sans MS", 40, bold=True, italic=False) }) btn_rect = pygame.rect.Rect(width / 2 - 125, height / 2 - 50, 250, 30) btn_options = { Options.BORDER_WIDTH: 0, Options.BACKGROUND: (20, 61, 89), Options.FOREGROUND: (244, 180, 26), Options.HOVERED_BACKGROUND: (10, 30, 45), Options.FONT: pygame.font.SysFont("Comic Sans MS", 25), } self.play_btn = Button(btn_rect, "Play", btn_options) self.stats_btn = Button(btn_rect.copy().move(0, 75), "Stats", btn_options) self.about_btn = Button(btn_rect.copy().move(0, 150), "About", btn_options) settings_gear_image = Resources.get("gear") settings_gear_rect = pygame.rect.Rect(width - 100, height - 100, 75, 75) self.settings_btn = Image( settings_gear_rect, settings_gear_image, { Options.BACKGROUND: (20, 61, 89), Options.HOVERED_BACKGROUND: (10, 30, 45) }) close_image = Resources.get("close") close_rect = pygame.rect.Rect(width - 75, 25, 50, 50) self.close_btn = Image( close_rect, close_image, { Options.BACKGROUND: (200, 0, 0), Options.HOVERED_BACKGROUND: (100, 0, 0) }) self.back_btn = Button( pygame.rect.Rect(10, 10, 60, 40), "Back", { Options.BORDER_WIDTH: 0, Options.BACKGROUND: (20, 61, 89), Options.FOREGROUND: (244, 180, 26), Options.HOVERED_BACKGROUND: (10, 30, 45), Options.FONT: pygame.font.SysFont("Comic Sans MS", 15) }) self.already_loaded = True
def start(self, screen): if not self.already_loaded: PenData.load_all_pens() width = screen.get_width() height = screen.get_height() self.back_btn = Button( pygame.Rect(10, 10, 60, 40), "Back", { Options.BORDER_WIDTH: 0, Options.BACKGROUND: (20, 61, 89), Options.FOREGROUND: (244, 180, 26), Options.HOVERED_BACKGROUND: (10, 30, 45), Options.FONT: pygame.font.SysFont("Comic Sans MS", 15) }) self.header = Label( pygame.Rect(width / 2 - 200, 10, 400, 30), "Choose your opponent!", { Options.BACKGROUND: (20, 61, 89), Options.FOREGROUND: (244, 180, 26), Options.BORDER_WIDTH: 0, }) self.name_text = Label( pygame.Rect(width / 2 - 45, height - 125, 90, 50), "", { Options.BACKGROUND: (82, 173, 200), Options.FOREGROUND: (20, 61, 89), Options.BORDER_WIDTH: 0, Options.FONT: pygame.font.SysFont("Comic Sans MS", 18) }) btn_options = { Options.BORDER_WIDTH: 0, Options.BACKGROUND: (20, 61, 89), Options.FOREGROUND: (244, 180, 26), Options.HOVERED_BACKGROUND: (10, 30, 45), Options.FONT: pygame.font.SysFont("Comic Sans MS", 25) } self.left_btn = Button(pygame.Rect(10, height / 2 - 20, 20, 30), "<", btn_options) self.right_btn = Button( pygame.Rect(width - 30, height / 2 - 20, 20, 30), ">", btn_options) self.select_btn = Button( pygame.Rect(width / 2 - 45, height - 75, 90, 50), "Select", btn_options) btn_options[Options.TOGGLED_BACKGROUND] = (5, 20, 30) self.random_diff_btn = ToggleButton( pygame.Rect(width * 1 / 5 - 50, 100, 100, 30), "Random", btn_options) self.easy_btn = ToggleButton( pygame.Rect(width * 2 / 5 - 50, 100, 100, 30), "Easy", btn_options) self.normal_btn = ToggleButton( pygame.Rect(width * 3 / 5 - 50, 100, 100, 30), "Normal", btn_options) self.hard_btn = ToggleButton( pygame.Rect(width * 4 / 5 - 50, 100, 100, 30), "Hard", btn_options) toggle_group = [ self.random_diff_btn, self.easy_btn, self.normal_btn, self.hard_btn ] for elt in toggle_group: elt.set_group(toggle_group) self.easy_btn.toggle() self.center_pos = pygame.Rect(width / 2 - 50, height / 2 - 50, 100, 100) self.random_pen_data = PenData.dict_to_pen({ "name": "Random", "image_file": "random_pen" }) for pen in [self.random_pen_data] + PenData.all_pens: self.pen_images.append( Image(self.center_pos, Resources.get(pen.image_file), {Options.BACKGROUND: (82, 173, 200)})) self.already_loaded = True self.reposition_images() self.update_enemy_data()
def start(self, screen): if not self.already_loaded: PenData.load_all_pens(Resources.get("all_pens")) width = screen.get_width() height = screen.get_height() self.back_btn = Button( pygame.Rect(10, 10, 60, 40), "Back", { Options.BORDER_WIDTH: 0, Options.BACKGROUND: (20, 61, 89), Options.FOREGROUND: (244, 180, 26), Options.HOVERED_BACKGROUND: (10, 30, 45), Options.FONT: pygame.font.SysFont("Comic Sans MS", 15) }) label_options = { Options.BACKGROUND: (20, 61, 89), Options.FOREGROUND: (244, 180, 26), Options.BORDER_WIDTH: 0, } self.header = Label(pygame.Rect(width / 2 - 200, 10, 400, 30), "Select your weapon!", label_options) self.coins_text = Label( pygame.Rect(width - 110, height - 55, 100, 40), "0", label_options) label_options = { Options.BACKGROUND: (82, 173, 200), Options.FOREGROUND: (20, 61, 89), Options.BORDER_WIDTH: 0, Options.FONT: pygame.font.SysFont("Comic Sans MS", 18) } self.density_text = Label(pygame.Rect(width / 5, 110, 100, 20), "Density: ", label_options) self.restitution_text = Label(pygame.Rect(width / 5, 130, 100, 20), "Restitution: ", label_options) self.name_text = Label( pygame.Rect(width / 2 - 45, height - 125, 90, 50), "", label_options) self.description_lines = [ Label(pygame.Rect(width * 2 / 3, 100 + i * 25, 100, 20), "", label_options) for i in range(0, 3) ] self.coins_image = Image( pygame.Rect(width - 175, height - 60, 50, 50), Resources.get("coin"), {Options.BACKGROUND: (82, 173, 200)}) btn_options = { Options.BORDER_WIDTH: 0, Options.BACKGROUND: (20, 61, 89), Options.FOREGROUND: (244, 180, 26), Options.HOVERED_BACKGROUND: (10, 30, 45), Options.FONT: pygame.font.SysFont("Comic Sans MS", 25) } self.left_btn = Button(pygame.Rect(10, height / 2 - 20, 20, 30), "<", btn_options) self.right_btn = Button( pygame.Rect(width - 30, height / 2 - 20, 20, 30), ">", btn_options) self.select_btn = Button( pygame.Rect(width / 2 - 45, height - 75, 90, 50), "Select", btn_options) self.purchase_btn = Button( pygame.Rect(width / 2 - 125, height - 75, 250, 40), "", btn_options) self.center_pos = pygame.Rect(width / 2 - 50, height / 2 - 50, 100, 100) for pen in PenData.all_pens: self.pen_images.append( Image(self.center_pos, Resources.get(pen.image_file), {Options.BACKGROUND: (82, 173, 200)})) self.already_loaded = True self.reposition_images() self.update_shop_data() self.reset_coin_text()
def _get_path(self): if isinstance(self.__dict__['path'], self.DefaultTLSCertificate): return Resources.get(self.__dict__['path']) else: return ApplicationData.get(self.__dict__['path'])
def showMessage(self, call_id, msgid, direction, sender, icon_path, content, timestamp, is_html=False, state='', recipient='', is_private=False, history_entry=False, media_type='chat', encryption=None): lock_icon_path = Resources.get('unlocked-darkgray.png') if encryption is not None: if encryption == '': lock_icon_path = Resources.get('unlocked-darkgray.png') else: lock_icon_path = Resources.get( 'locked-green.png' if encryption == 'verified' else 'locked-red.png') if self.last_sender == sender: icon_path = "null" else: icon_path = "'%s'" % icon_path self.last_sender = sender if not history_entry and not self.delegate.isOutputFrameVisible(): self.delegate.showChatViewWhileVideoActive() # keep track of rendered messages to toggle the smileys or search their content later rendered_message = ChatMessageObject(call_id, msgid, content, is_html, timestamp, media_type) self.rendered_messages.append(rendered_message) if timestamp.date() != datetime.date.today(): displayed_timestamp = time.strftime( "%F %H:%M", time.localtime(calendar.timegm(timestamp.utctimetuple()))) else: displayed_timestamp = time.strftime( "%H:%M", time.localtime(calendar.timegm(timestamp.utctimetuple()))) content = processHTMLText(content, self.expandSmileys, is_html) private = 1 if is_private else "null" if is_private and recipient: label = NSLocalizedString( "Private message to %s", "Label") % html.escape( recipient ) if direction == 'outgoing' else NSLocalizedString( "Private message from %s", "Label") % html.escape(sender) else: if hasattr(self.delegate, "sessionController"): label = html.escape( self.delegate.sessionController.nickname or self.account.display_name or self.account.id) if sender is None else html.escape(sender) else: label = html.escape( self.account.display_name or self.account.id) if sender is None else html.escape(sender) try: script = """renderMessage('%s', '%s', '%s', %s, "%s", '%s', '%s', %s, '%s', '%s')""" % ( msgid, direction, label, icon_path, content, displayed_timestamp, state, private, lock_icon_path, self.previous_msgid) except UnicodeDecodeError: script = """renderMessage('%s', '%s', '%s', %s, "%s", '%s', '%s', %s, '%s', '%s')""" % ( msgid, direction, label, icon_path, content.decode('utf-8'), displayed_timestamp, state, private, lock_icon_path, self.previous_msgid) except Exception as e: self.delegate.showSystemMessage( "Chat message id %s rendering error: %s" % (msgid, e), ISOTimestamp.now(), True) return if self.finishedLoading: self.executeJavaScript(script) else: self.messageQueue.append(script) if hasattr(self.delegate, "chatViewDidGetNewMessage_"): self.delegate.chatViewDidGetNewMessage_(self) self.previous_msgid = msgid
def update_ringtones(self, account=None): settings = SIPSimpleSettings() if account is None: account = AccountManager().default_account app = SIPApplication() def change_tone(name, new_tone): current = getattr(self, name) if current and current.is_active: current.stop() if new_tone: new_tone.start() setattr(self, name, new_tone) change_tone( "initial_hold_tone", WavePlayer(app.voice_audio_mixer, Resources.get('hold_tone.wav'), volume=10)) app.voice_audio_bridge.add(self.initial_hold_tone) change_tone( "secondary_hold_tone", WavePlayer(app.voice_audio_mixer, Resources.get('hold_tone.wav'), loop_count=0, pause_time=45, volume=10, initial_delay=45)) app.voice_audio_bridge.add(self.secondary_hold_tone) if account: audio_primary_ringtone = account.sounds.audio_inbound.sound_file if account.sounds.audio_inbound is not None else None else: audio_primary_ringtone = None if audio_primary_ringtone and not settings.audio.silent: # Workaround not to use same device from two bridges. -Saul if settings.audio.alert_device is not None and app.alert_audio_mixer.real_output_device == app.voice_audio_mixer.real_output_device: new_tone = WavePlayer(app.voice_audio_mixer, audio_primary_ringtone.path, loop_count=0, pause_time=6) app.voice_audio_bridge.add(new_tone) else: new_tone = WavePlayer(app.alert_audio_mixer, audio_primary_ringtone.path, loop_count=0, pause_time=6) app.alert_audio_bridge.add(new_tone) else: new_tone = None change_tone("audio_primary_ringtone", new_tone) if audio_primary_ringtone and not settings.audio.silent: new_tone = WavePlayer(app.voice_audio_mixer, Resources.get('ring_tone.wav'), loop_count=0, pause_time=6) app.voice_audio_bridge.add(new_tone) else: new_tone = None change_tone("audio_secondary_ringtone", new_tone) if audio_primary_ringtone and not settings.audio.silent: # Workaround not to use same device from two bridges. -Saul if settings.audio.alert_device is not None and app.alert_audio_mixer.real_output_device == app.voice_audio_mixer.real_output_device: new_tone = WavePlayer(app.voice_audio_mixer, Resources.get('ring_tone.wav'), loop_count=0, pause_time=6) app.voice_audio_bridge.add(new_tone) else: new_tone = WavePlayer(app.alert_audio_mixer, Resources.get('ring_tone.wav'), loop_count=0, pause_time=6) app.alert_audio_bridge.add(new_tone) else: new_tone = None change_tone("chat_primary_ringtone", new_tone) if audio_primary_ringtone and not settings.audio.silent: new_tone = WavePlayer(app.voice_audio_mixer, Resources.get('ring_tone.wav'), loop_count=0, pause_time=6) app.voice_audio_bridge.add(new_tone) else: new_tone = None change_tone("chat_secondary_ringtone", new_tone) chat_message_outgoing_sound = settings.sounds.message_sent if chat_message_outgoing_sound and not settings.audio.silent: new_tone = WavePlayer(app.voice_audio_mixer, chat_message_outgoing_sound.path, volume=chat_message_outgoing_sound.volume) app.voice_audio_bridge.add(new_tone) else: new_tone = None change_tone("chat_message_outgoing_sound", new_tone) chat_message_incoming_sound = settings.sounds.message_received if chat_message_incoming_sound and not settings.audio.silent: new_tone = WavePlayer(app.voice_audio_mixer, chat_message_incoming_sound.path, volume=chat_message_incoming_sound.volume) app.voice_audio_bridge.add(new_tone) else: new_tone = None change_tone("chat_message_incoming_sound", new_tone) file_transfer_outgoing_sound = settings.sounds.file_sent if file_transfer_outgoing_sound and not settings.audio.silent: new_tone = WavePlayer(app.voice_audio_mixer, file_transfer_outgoing_sound.path, volume=file_transfer_outgoing_sound.volume) app.voice_audio_bridge.add(new_tone) else: new_tone = None change_tone("file_transfer_outgoing_sound", new_tone) file_transfer_incoming_sound = settings.sounds.file_received if file_transfer_incoming_sound and not settings.audio.silent: new_tone = WavePlayer(app.voice_audio_mixer, file_transfer_incoming_sound.path, volume=file_transfer_incoming_sound.volume) app.voice_audio_bridge.add(new_tone) else: new_tone = None change_tone("file_transfer_incoming_sound", new_tone)
def _get_path(self): if isinstance(self.__dict__['path'], self.DefaultTLSCertificate): return Resources.get(self.__dict__['path']) else: return ApplicationData.get(self.__dict__['path'])
def _get_path(self): return Resources.get(self.__dict__['path'])
def start(self, screen): width = screen.get_width() height = screen.get_height() if self.already_loaded: btn_options = { Options.BORDER_WIDTH: 0, Options.BACKGROUND: (20, 61, 89), Options.FOREGROUND: (244, 180, 26), Options.HOVERED_BACKGROUND: (10, 30, 45), } del_btn_options = { Options.BORDER_WIDTH: 0, Options.BACKGROUND: (200, 20, 40), Options.FOREGROUND: (244, 180, 26), Options.HOVERED_BACKGROUND: (150, 5, 20), } original_names = [btn.text for btn in self.account_btns] account_names = Account.get_account_names() for name in original_names: if name not in account_names: btn_to_delete = self.account_btns[[ idx for idx, btn in enumerate(self.account_btns) if btn.text == name ][0]] self.account_btns.remove(btn_to_delete) self.delete_btns.pop(btn_to_delete) for name in account_names: if name not in original_names: btn = Button(pygame.rect.Rect(0, 0, 0, 0), name, btn_options) self.account_btns.append(btn) del_btn = Button(pygame.rect.Rect(0, 0, 30, 30), "X", del_btn_options) self.delete_btns[btn] = del_btn self.account_btns.sort(key=(lambda btn: btn.text)) else: self.header = Label(pygame.rect.Rect(width / 2 - 200, 10, 400, 30), "Select account to load", options={ Options.BACKGROUND: (20, 61, 89), Options.FOREGROUND: (244, 180, 26), Options.BORDER_WIDTH: 0, }) close_image = Resources.get("close") close_rect = pygame.rect.Rect(width - 75, 25, 50, 50) self.close_btn = Image( close_rect, close_image, { Options.BACKGROUND: (200, 0, 0), Options.HOVERED_BACKGROUND: (100, 0, 0) }) self.no_account_text = Label( pygame.rect.Rect(width / 2 - 350, height / 2, 550, 30), "No account created. Click the New button to make one.", options={ Options.BACKGROUND: (82, 173, 200), Options.FOREGROUND: (20, 61, 89), Options.BORDER_WIDTH: 0, }) self.first_offset = pygame.rect.Rect(width / 2 - 125, 75, 250, 30) btn_options = { Options.BORDER_WIDTH: 0, Options.BACKGROUND: (20, 61, 89), Options.FOREGROUND: (244, 180, 26), Options.HOVERED_BACKGROUND: (10, 30, 45), } del_btn_options = { Options.BORDER_WIDTH: 0, Options.BACKGROUND: (200, 20, 40), Options.FOREGROUND: (244, 180, 26), Options.HOVERED_BACKGROUND: (150, 5, 20), } account_names = Account.get_account_names() for name in account_names: btn = Button(pygame.rect.Rect(0, 0, 0, 0), name, btn_options) self.account_btns.append(btn) del_btn = Button(pygame.rect.Rect(0, 0, 30, 30), "X", del_btn_options) self.delete_btns[btn] = del_btn btn_options = { Options.BORDER_WIDTH: 0, Options.BACKGROUND: (20, 61, 89), Options.FOREGROUND: (244, 180, 26), Options.HOVERED_BACKGROUND: (10, 30, 45), Options.FONT: pygame.font.SysFont("Comic Sans MS", 15) } self.up_btn = Button( pygame.rect.Rect(width * 5 / 6, height * 2 / 6, 60, 40), "Up", btn_options) self.create_btn = Button( pygame.rect.Rect(width * 5 / 6, height * 3 / 6 - 20, 60, 40), "New", btn_options) self.down_btn = Button( pygame.rect.Rect(width * 5 / 6, height * 4 / 6 - 40, 60, 40), "Down", btn_options) self.already_loaded = True Account.current_account = None self.btn_index = 0 self.reposition_buttons()
def sound_file(self): if isinstance(self._sound_file, self.DefaultSoundFile): return UserSoundFile(Resources.get(self._sound_file.setting)) else: return self._sound_file
def sound_file(self): if isinstance(self._sound_file, self.DefaultSoundFile): return UserSoundFile(Resources.get(self._sound_file.setting)) else: return self._sound_file
def update_ringtones(self, account=None): settings = SIPSimpleSettings() if account is None: account = AccountManager().default_account app = SIPApplication() def change_tone(name, new_tone): current = getattr(self, name) if current and current.is_active: current.stop() if new_tone: new_tone.start() setattr(self, name, new_tone) change_tone("initial_hold_tone", WavePlayer(app.voice_audio_mixer, Resources.get('hold_tone.wav'), volume=10)) app.voice_audio_bridge.add(self.initial_hold_tone) change_tone("secondary_hold_tone", WavePlayer(app.voice_audio_mixer, Resources.get('hold_tone.wav'), loop_count=0, pause_time=45, volume=10, initial_play=False)) app.voice_audio_bridge.add(self.secondary_hold_tone) if account: audio_primary_ringtone = account.sounds.audio_inbound.sound_file if account.sounds.audio_inbound is not None else None else: audio_primary_ringtone = None if audio_primary_ringtone and not settings.audio.silent: # Workaround not to use same device from two bridges. -Saul if settings.audio.alert_device is not None and app.alert_audio_mixer.real_output_device == app.voice_audio_mixer.real_output_device: new_tone = WavePlayer(app.voice_audio_mixer, audio_primary_ringtone.path, loop_count=0, pause_time=6) app.voice_audio_bridge.add(new_tone) else: new_tone = WavePlayer(app.alert_audio_mixer, audio_primary_ringtone.path, loop_count=0, pause_time=6) app.alert_audio_bridge.add(new_tone) else: new_tone = None change_tone("audio_primary_ringtone", new_tone) if audio_primary_ringtone and not settings.audio.silent: new_tone = WavePlayer(app.voice_audio_mixer, Resources.get('ring_tone.wav'), loop_count=0, pause_time=6) app.voice_audio_bridge.add(new_tone) else: new_tone = None change_tone("audio_secondary_ringtone", new_tone) if audio_primary_ringtone and not settings.audio.silent: # Workaround not to use same device from two bridges. -Saul if settings.audio.alert_device is not None and app.alert_audio_mixer.real_output_device == app.voice_audio_mixer.real_output_device: new_tone = WavePlayer(app.voice_audio_mixer, Resources.get('ring_tone.wav'), loop_count=0, pause_time=6) app.voice_audio_bridge.add(new_tone) else: new_tone = WavePlayer(app.alert_audio_mixer, Resources.get('ring_tone.wav'), loop_count=0, pause_time=6) app.alert_audio_bridge.add(new_tone) else: new_tone = None change_tone("chat_primary_ringtone", new_tone) if audio_primary_ringtone and not settings.audio.silent: new_tone = WavePlayer(app.voice_audio_mixer, Resources.get('ring_tone.wav'), loop_count=0, pause_time=6) app.voice_audio_bridge.add(new_tone) else: new_tone = None change_tone("chat_secondary_ringtone", new_tone) chat_message_outgoing_sound = settings.sounds.message_sent if chat_message_outgoing_sound and not settings.audio.silent: new_tone = WavePlayer(app.voice_audio_mixer, chat_message_outgoing_sound.path, volume=chat_message_outgoing_sound.volume) app.voice_audio_bridge.add(new_tone) else: new_tone = None change_tone("chat_message_outgoing_sound", new_tone) chat_message_incoming_sound = settings.sounds.message_received if chat_message_incoming_sound and not settings.audio.silent: new_tone = WavePlayer(app.voice_audio_mixer, chat_message_incoming_sound.path, volume=chat_message_incoming_sound.volume) app.voice_audio_bridge.add(new_tone) else: new_tone = None change_tone("chat_message_incoming_sound", new_tone) file_transfer_outgoing_sound = settings.sounds.file_sent if file_transfer_outgoing_sound and not settings.audio.silent: new_tone = WavePlayer(app.voice_audio_mixer, file_transfer_outgoing_sound.path, volume=file_transfer_outgoing_sound.volume) app.voice_audio_bridge.add(new_tone) else: new_tone = None change_tone("file_transfer_outgoing_sound", new_tone) file_transfer_incoming_sound = settings.sounds.file_received if file_transfer_incoming_sound and not settings.audio.silent: new_tone = WavePlayer(app.voice_audio_mixer, file_transfer_incoming_sound.path, volume=file_transfer_incoming_sound.volume) app.voice_audio_bridge.add(new_tone) else: new_tone = None change_tone("file_transfer_incoming_sound", new_tone)
def _get_path(self): return Resources.get(self.__dict__['path'])
def showMessage(self, call_id, msgid, direction, sender, icon_path, text, timestamp, is_html=False, state='', recipient='', is_private=False, history_entry=False, media_type='chat', encryption=None): lock_icon_path = Resources.get('unlocked-darkgray.png') if encryption is not None: if encryption == '': lock_icon_path = Resources.get('unlocked-darkgray.png') else: lock_icon_path = Resources.get('locked-green.png' if encryption == 'verified' else 'locked-red.png') if self.last_sender == sender: icon_path = "null" else: icon_path = "'%s'" % icon_path self.last_sender = sender if not history_entry and not self.delegate.isOutputFrameVisible(): self.delegate.showChatViewWhileVideoActive() # keep track of rendered messages to toggle the smileys or search their content later rendered_message = ChatMessageObject(call_id, msgid, text, is_html, timestamp, media_type) self.rendered_messages.append(rendered_message) if timestamp.date() != datetime.date.today(): displayed_timestamp = time.strftime("%F %T", time.localtime(calendar.timegm(timestamp.utctimetuple()))) else: displayed_timestamp = time.strftime("%T", time.localtime(calendar.timegm(timestamp.utctimetuple()))) if is_html: # urlify links soup = BeautifulSoup(text) ps = soup.find_all('p') for p in ps: if not p.string: continue ptext = p.string.strip() p.clear() tokens = _url_pattern.split(ptext) for token in tokens: if _url_pattern.match(token): new_tag = soup.new_tag("a", href=token) new_tag.string = token p.append(new_tag) else: p.append(token) text = soup.prettify() text = processHTMLText(text, self.expandSmileys, is_html) private = 1 if is_private else "null" if is_private and recipient: label = NSLocalizedString("Private message to %s", "Label") % cgi.escape(recipient) if direction == 'outgoing' else NSLocalizedString("Private message from %s", "Label") % cgi.escape(sender) else: if hasattr(self.delegate, "sessionController"): label = cgi.escape(self.delegate.sessionController.nickname or self.account.display_name or self.account.id) if sender is None else cgi.escape(sender) else: label = cgi.escape(self.account.display_name or self.account.id) if sender is None else cgi.escape(sender) script = """renderMessage('%s', '%s', '%s', %s, "%s", '%s', '%s', %s, '%s', '%s')""" % (msgid, direction, label, icon_path, text, displayed_timestamp, state, private, lock_icon_path, self.previous_msgid) if self.finishedLoading: self.executeJavaScript(script) else: self.messageQueue.append(script) if hasattr(self.delegate, "chatViewDidGetNewMessage_"): self.delegate.chatViewDidGetNewMessage_(self) self.previous_msgid = msgid