Implement Discord mute/deafen status detection and control via serial communication

This commit is contained in:
ZareMate 2025-01-13 14:36:02 +01:00
parent 110b0daebb
commit 2fdfa7d3df
Signed by: zaremate
GPG Key ID: 369A0E45E03A81C3
6 changed files with 104 additions and 1 deletions

18
colors.py Normal file
View File

@ -0,0 +1,18 @@
import keyboard
import time
import serial.tools.list_ports as list_ports
import pygetwindow as gw
import pyautogui
while True:
if keyboard.is_pressed('m'):
x, y = pyautogui.position()
time.sleep(1)
color = pyautogui.screenshot().getpixel((x, y))
print(f"Coordinates: ({x}, {y}), Color: {color}")
if keyboard.is_pressed('d'):
x2, y2 = pyautogui.position()
time.sleep(1)
color2 = pyautogui.screenshot().getpixel((x2, y2))
print(f"Coordinates: ({x2}, {y2}), Color: {color2}")
time.sleep(0.1)

BIN
deafen_screenshot.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 69 B

55
main.py
View File

@ -2,6 +2,11 @@ import serial
import time
import keyboard
import serial.tools.list_ports as list_ports
import pygetwindow as gw
import pyautogui
import mss
import numpy as np
def get_serial_port():
ports = list(list_ports.comports())
@ -14,6 +19,43 @@ def get_serial_port():
choice = int(input("Select a port by number: "))
return ports[choice].device
x = -1772
y = 1059
x2 = -1745
y2 = 1064
width = 1
height = 1
expected_r = 242
expected_g = 63
expected_b = 67
def get_discord_status():
with mss.mss() as sct:
# Define the region where the mute and deafen icons are located
mute_region = {"top": y, "left": x, "width": width, "height": height}
deafen_region = {"top": y2, "left": x2, "width": width, "height": height}
# Capture the screen region
mute_screenshot = sct.grab(mute_region)
deafen_screenshot = sct.grab(deafen_region)
# Convert the screenshots to numpy arrays
mute_image = np.array(mute_screenshot)
deafen_image = np.array(deafen_screenshot)
# Save the screenshots to files
mss.tools.to_png(mute_screenshot.rgb, mute_screenshot.size, output="mute_screenshot.png")
mss.tools.to_png(deafen_screenshot.rgb, deafen_screenshot.size, output="deafen_screenshot.png")
# Check the pixel color at (0, 0)
mute_status = (mute_image[0, 0, 2] == expected_r and
mute_image[0, 0, 1] == expected_g and
mute_image[0, 0, 0] == expected_b)
deafen_status = (deafen_image[0, 0, 2] == expected_r and
deafen_image[0, 0, 1] == expected_g and
deafen_image[0, 0, 0] == expected_b)
return mute_status, deafen_status
def main():
port = get_serial_port()
if not port:
@ -24,6 +66,10 @@ def main():
time.sleep(2) # Wait for the connection to initialize
print("Listening for commands...")
last_mute_status, last_deafen_status = get_discord_status()
print(f"Mute: {last_mute_status}, Deafen: {last_deafen_status}")
ser.write(f"Mute: {last_mute_status}, Deafen: {last_deafen_status}\n".encode('utf-8'))
while True:
try:
if ser.in_waiting > 0:
@ -34,9 +80,18 @@ def main():
keyboard.send('ctrl+shift+f16')
elif line == "deafen":
keyboard.send('ctrl+shift+f15')
elif line == "status":
mute_status, deafen_status = get_discord_status()
ser.write(f"Mute: {mute_status}, Deafen: {deafen_status}\n".encode('utf-8'))
else:
print(f"Unknown command: {line}")
current_mute_status, current_deafen_status = get_discord_status()
if current_mute_status != last_mute_status or current_deafen_status != last_deafen_status:
ser.write(f"Mute: {current_mute_status}, Deafen: {current_deafen_status}\n".encode('utf-8'))
print(f"Mute: {current_mute_status}, Deafen: {current_deafen_status}")
last_mute_status, last_deafen_status = current_mute_status, current_deafen_status
time.sleep(0.1)
except KeyboardInterrupt:
print("Exiting program.")

View File

@ -1,7 +1,12 @@
#define MUTE_PIN 18
#define DEAFEN_PIN 19
void setup()
{
pinMode(16, INPUT_PULLUP); // D16 for "mute" button
pinMode(16, INPUT_PULLUP); // D16 for "mute" button
pinMode(17, INPUT_PULLUP); // D17 for "deafen" button
pinMode(MUTE_PIN, OUTPUT);
pinMode(DEAFEN_PIN, OUTPUT);
Serial.begin(115200);
}
@ -18,4 +23,29 @@ void loop()
Serial.println("deafen");
delay(200); // Debounce delay
}
if (Serial.available() > 0)
{
String input = Serial.readStringUntil('\n');
if (input == "Mute: True, Deafen: False")
{
digitalWrite(MUTE_PIN, HIGH);
digitalWrite(DEAFEN_PIN, LOW);
}
else if (input == "Mute: True, Deafen: True")
{
digitalWrite(MUTE_PIN, HIGH);
digitalWrite(DEAFEN_PIN, HIGH);
}
else if (input == "Mute: False, Deafen: False")
{
digitalWrite(MUTE_PIN, LOW);
digitalWrite(DEAFEN_PIN, LOW);
}
else if (input == "Mute: False, Deafen: True")
{
digitalWrite(MUTE_PIN, LOW);
digitalWrite(DEAFEN_PIN, HIGH);
}
}
}

BIN
mute_screenshot.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 69 B