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)
Exemple #3
0
    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
Exemple #4
0
    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
Exemple #5
0
    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()
Exemple #7
0
    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))
Exemple #10
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)
Exemple #11
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)
Exemple #12
0
    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
Exemple #13
0
    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
Exemple #17
0
    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()
Exemple #19
0
 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
Exemple #21
0
    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)
Exemple #22
0
 def _get_path(self):
     if isinstance(self.__dict__['path'], self.DefaultTLSCertificate):
         return Resources.get(self.__dict__['path'])
     else:
         return ApplicationData.get(self.__dict__['path'])
Exemple #23
0
 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()
Exemple #25
0
 def sound_file(self):
     if isinstance(self._sound_file, self.DefaultSoundFile):
         return UserSoundFile(Resources.get(self._sound_file.setting))
     else:
         return self._sound_file
Exemple #26
0
 def sound_file(self):
     if isinstance(self._sound_file, self.DefaultSoundFile):
         return UserSoundFile(Resources.get(self._sound_file.setting))
     else:
         return self._sound_file
Exemple #27
0
    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)
Exemple #28
0
 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