class Tooltip(PopupPanel):
    def __init__(self, sender, offsetX, offsetY, text, show_delay, hide_delay,
                 styleName):
        global tooltip_hide_timer

        PopupPanel.__init__(self, True)
        self.show_delay = show_delay
        self.hide_delay = hide_delay

        contents = HTML(text)
        self.add(contents)

        left = sender.getAbsoluteLeft() + offsetX
        top = sender.getAbsoluteTop() + offsetY

        self.setPopupPosition(left, top)
        self.setStyleName(styleName)

        if tooltip_hide_timer:
            self.tooltip_show_timer = Timer(1, self)
        else:
            self.tooltip_show_timer = Timer(self.show_delay, self)

    def show(self):
        global tooltip_hide_timer

        # activate fast tooltips
        tooltip_hide_timer = Timer(self.hide_delay, self)
        PopupPanel.show(self)

    def hide(self):
        self.tooltip_show_timer.cancel()
        PopupPanel.hide(self)

    def onTimer(self, id):
        global tooltip_hide_timer

        # deactivate fast tooltips on last timer
        if tooltip_hide_timer and id == tooltip_hide_timer.getID():
            tooltip_hide_timer = None

        if id == self.tooltip_show_timer.getID():
            self.show()
        else:
            self.hide()
Exemplo n.º 2
0
class Tooltip(PopupPanel):
    def __init__(self, sender, offsetX, offsetY, text, show_delay, hide_delay, styleName):
        global tooltip_hide_timer
        
        PopupPanel.__init__(self, True)
        self.show_delay = show_delay
        self.hide_delay = hide_delay
        
        contents = HTML(text)
        self.add(contents)

        left = sender.getAbsoluteLeft() + offsetX
        top = sender.getAbsoluteTop() + offsetY

        self.setPopupPosition(left, top)
        self.setStyleName(styleName)

        if tooltip_hide_timer:
            self.tooltip_show_timer = Timer(1, self)
        else:
            self.tooltip_show_timer = Timer(self.show_delay, self)
        
    def show(self):
        global tooltip_hide_timer
        
        # activate fast tooltips
        tooltip_hide_timer=Timer(self.hide_delay, self)
        PopupPanel.show(self)

    def hide(self):
        self.tooltip_show_timer.cancel()
        PopupPanel.hide(self)

    def onTimer(self, id):
        global tooltip_hide_timer

        # deactivate fast tooltips on last timer
        if tooltip_hide_timer and id == tooltip_hide_timer.getID():
            tooltip_hide_timer = None

        if id == self.tooltip_show_timer.getID():
            self.show()
        else:
            self.hide()
Exemplo n.º 3
0
class TTSBot(discord.Client):

    def __init__(self, language="en"):
        super().__init__()
        self.timer = None
        if not os.path.exists(DATA_FOLDER):
            os.makedirs(DATA_FOLDER)
        self.CurrentConnection = None
        self.language = language
        self.queue = queue.Queue()
        self.play_next()
        self.TTSProvider = GoogleTTSProvider()
        self.current_text_channel = None

    async def call_bot(self, channel):
        self.CurrentConnection = await channel.connect()
        self.play_next()

    async def goodbye_bot(self):
        await self.current_text_channel.send('Goodbye!')
        await self.CurrentConnection.disconnect()
        self.CurrentConnection = None
        self.queue = queue.Queue()
        clean_data_folder()
        self.stop_timeout()

    async def on_ready(self):
        print('Logged in as {0.user}'.format(client))

    def play_next(self):
        if self.CurrentConnection is not None \
                and not self.CurrentConnection.is_playing() \
                and not self.queue.empty():
            to_play = self.queue.get()
            self.CurrentConnection.play(discord.FFmpegPCMAudio(to_play, options="-loglevel panic"),
                                        after=lambda e: delete_file(filename=to_play))
        if self.CurrentConnection is not None:
            self.loop.call_later(0.5, self.play_next)

    def abort_playback(self):
        file = ""
        self.CurrentConnection.stop()
        while True:
            try:
                file = self.queue.get(block=False)
                delete_file(file)
            except queue.Empty:
                break
        self.queue = queue.Queue()
        clean_data_folder()

    def play(self, file):
        self.CurrentConnection.play(file)

    def start_timeout(self):
        if self.timer is None:
            self.timer = Timer(TIMEOUT, self.timeout_callback)

    def reset_timeout(self):
        if self.timer is not None:
            self.timer.cancel()
        self.timer = Timer(TIMEOUT, self.timeout_callback)

    def stop_timeout(self):
        if self.timer is not None:
            self.timer.cancel()

    async def timeout_callback(self):
        await self.goodbye_bot()

    async def on_message(self, message):
        if message.author == self.user:
            return

        elif message.content == "!call":
            self.current_text_channel = message.channel
            await self.current_text_channel.send('Hello!')
            await self.call_bot(message.author.voice.channel)
            self.start_timeout()


        elif message.content == '!bye' \
                and self.CurrentConnection is not None \
                and self.CurrentConnection.is_connected():
            await self.goodbye_bot()

        elif message.content == "!abort":
            self.abort_playback()

        elif message.content.startswith("http"):
            # ignore links
            return

        else:
            if self.CurrentConnection is not None \
                    and self.CurrentConnection.is_connected() \
                    and len(message.content) > 0:
                # Cancel Time one new Message
                self.reset_timeout()
                lang = self.language
                text = user_input = message.content
                print(f"{message.author} says {message.content}.")
                if user_input[0] == "+":
                    divider = user_input.find(" ")
                    lang = user_input[1:divider]
                    text = user_input[(divider + 1):]
                # Create uuid as filename
                name = uuid.uuid1()
                # Play the requested text
                try:
                    filename = f'{DATA_FOLDER}/{name}.mp3'

                    self.TTSProvider.create_audio_file(filename, lang, text)

                    self.queue.put(filename)
                except ValueError as e:
                    print(f"{message.author} says {message.content}.")
                    await self.current_text_channel.send(f"Language not supported or no Text provided.")
                    if hasattr(e, 'message'):
                        print(e.message)
                    else:
                        print(e)