diff --git a/discover_overlay/discord_connector.py b/discover_overlay/discord_connector.py index e7cfc35..a372eae 100644 --- a/discover_overlay/discord_connector.py +++ b/discover_overlay/discord_connector.py @@ -160,8 +160,12 @@ class DiscordConnector: user["speaking"] = olduser["speaking"] if "nick" not in user and "nick" in olduser: user["nick"] = olduser["nick"] + if "lastspoken" not in user and "lastspoken" in olduser: + user["lastspoken"] = olduser["lastspoken"] if olduser["avatar"] != user["avatar"]: self.voice_overlay.delete_avatar(user["id"]) + if "lastspoken" not in user: # Still nothing? + user["lastspoken"] = 0 # EEEEPOOCH EEEEEPOCH! BELIEVE MEEEE self.userlist[user["id"]] = user def on_message(self, message): @@ -205,6 +209,8 @@ class DiscordConnector: # It's only possible to get alerts for the room you're in self.set_channel(j["data"]["channel_id"]) self.userlist[j["data"]["user_id"]]["speaking"] = True + self.userlist[j["data"]["user_id"]]["lastspoken"] = time.time() + self.list_altered = True self.set_in_room(j["data"]["user_id"], True) elif j["evt"] == "SPEAKING_STOP": self.list_altered = True diff --git a/discover_overlay/voice_overlay.py b/discover_overlay/voice_overlay.py index 82fe9c9..9ed7a79 100644 --- a/discover_overlay/voice_overlay.py +++ b/discover_overlay/voice_overlay.py @@ -88,7 +88,10 @@ class VoiceOverlayWindow(OverlayWindow): def set_highlight_self(self, highlight_self): self.highlight_self = highlight_self - + + def set_order(self, i): + self.order = i + def set_icon_only(self, i): self.icon_only = i self.redraw() @@ -121,7 +124,12 @@ class VoiceOverlayWindow(OverlayWindow): user["friendlyname"] = user["nick"] else: user["friendlyname"] = user["username"] - self.userlist.sort(key=lambda x: x["friendlyname"]) + if self.order == 1: # ID Sort + self.userlist.sort(key=lambda x: x["id"]) + elif self.order == 2: # Spoken sort + self.userlist.sort(key=lambda x: x["lastspoken"], reverse=True) + else: # Name sort + self.userlist.sort(key=lambda x: x["friendlyname"]) screen = self.get_screen() c = screen.is_composited() if not self.compositing == c: @@ -230,13 +238,14 @@ class VoiceOverlayWindow(OverlayWindow): mute = False deaf = False alpha = 1.0 - if "speaking" in user and user["speaking"]: - c = self.talk_col + if "mute" in user and user["mute"]: mute = True if "deaf" in user and user["deaf"]: deaf = True alpha = 0.5 + if "speaking" in user and user["speaking"] and not deaf and not mute: + c = self.talk_col pix = None if user["id"] in self.avatars: pix = self.avatars[user["id"]] diff --git a/discover_overlay/voice_settings.py b/discover_overlay/voice_settings.py index d068510..2cda7d8 100644 --- a/discover_overlay/voice_settings.py +++ b/discover_overlay/voice_settings.py @@ -68,6 +68,7 @@ class VoiceSettingsWindow(SettingsWindow): self.floating_y = config.getint("main", "floating_y", fallback=0) self.floating_w = config.getint("main", "floating_w", fallback=400) self.floating_h = config.getint("main", "floating_h", fallback=400) + self.order = config.getint("main", "order", fallback=0) # Pass all of our config over to the overlay self.overlay.set_align_x(self.align_x) @@ -86,6 +87,7 @@ class VoiceSettingsWindow(SettingsWindow): self.overlay.set_monitor(self.get_monitor_index(self.monitor)) self.overlay.set_vert_edge_padding(self.vert_edge_padding) self.overlay.set_horz_edge_padding(self.horz_edge_padding) + self.overlay.set_order(self.order) self.overlay.set_floating( self.floating, self.floating_x, self.floating_y, self.floating_w, self.floating_h) @@ -128,6 +130,7 @@ class VoiceSettingsWindow(SettingsWindow): config.set("main", "floating_y", "%s" % (self.floating_y)) config.set("main", "floating_w", "%s" % (self.floating_w)) config.set("main", "floating_h", "%s" % (self.floating_h)) + config.set("main", "order", "%s" % (self.order)) with open(self.configFile, 'w') as file: config.write(file) @@ -281,6 +284,19 @@ class VoiceSettingsWindow(SettingsWindow): icon_only.set_active(self.icon_only) icon_only.connect("toggled", self.change_icon_only) + # Order avatars + order_label = Gtk.Label.new("Order Avatars By") + order_store = Gtk.ListStore(str) + order_store.append(["Alphabetically"]) + order_store.append(["ID"]) + order_store.append(["Last Spoken"]) + order = Gtk.ComboBox.new_with_model(order_store) + order.set_active(self.order) + order.connect("changed", self.change_order) + rt = Gtk.CellRendererText() + order.pack_start(rt, True) + order.add_attribute(rt, "text", 0) + box.attach(font_label, 0, 0, 1, 1) box.attach(font, 1, 0, 1, 1) box.attach(bg_col_label, 0, 1, 1, 1) @@ -315,6 +331,8 @@ class VoiceSettingsWindow(SettingsWindow): box.attach(highlight_self, 1, 17, 1, 1) box.attach(icon_only_label, 0, 18, 1, 1) box.attach(icon_only, 1, 18, 1, 1) + box.attach(order_label, 0, 19, 1, 1) + box.attach(order, 1, 19, 1, 1) self.add(box) @@ -485,3 +503,9 @@ class VoiceSettingsWindow(SettingsWindow): self.icon_only = button.get_active() self.save_config() + + def change_order(self, button): + self.overlay.set_order(button.get_active()) + + self.order = button.get_active() + self.save_config()