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()
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()
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)