Add system tray functionality and improve Discord status detection logic
This commit is contained in:
parent
2fdfa7d3df
commit
062c6252a2
1
.gitignore
vendored
1
.gitignore
vendored
@ -0,0 +1 @@
|
||||
./*.png
|
||||
BIN
DISCORD.lnk
BIN
DISCORD.lnk
Binary file not shown.
60
README.md
Normal file
60
README.md
Normal file
@ -0,0 +1,60 @@
|
||||
# ESP32 Discord Controller
|
||||
|
||||
This project allows you to control Discord mute and deafen status using an ESP32 device. The script captures the screen to detect the status and communicates with the ESP32 via a serial connection.
|
||||
|
||||
## Installation
|
||||
|
||||
### Prerequisites
|
||||
|
||||
- Python 3.x
|
||||
- pip (Python package installer)
|
||||
- An ESP32 device
|
||||
- A USB cable to connect the ESP32 to your computer
|
||||
|
||||
### Python Packages
|
||||
|
||||
Install the required Python packages using pip:
|
||||
|
||||
```sh
|
||||
pip install pyserial keyboard pygetwindow pyautogui mss numpy pystray pillow
|
||||
```
|
||||
|
||||
### Clone the Repository
|
||||
|
||||
Clone this repository to your local machine:
|
||||
|
||||
```sh
|
||||
git clone https://github.com/yourusername/ESP32-discord.git
|
||||
cd ESP32-discord
|
||||
```
|
||||
|
||||
## Usage
|
||||
|
||||
### Running the Script
|
||||
|
||||
You can run the script with the following command:
|
||||
|
||||
```sh
|
||||
python main.py
|
||||
```
|
||||
|
||||
### Specifying the COM Port
|
||||
|
||||
You can specify the COM port directly when running the script:
|
||||
|
||||
```sh
|
||||
python main.py -com=COM3
|
||||
```
|
||||
|
||||
### Hiding the Console Window
|
||||
|
||||
If the COM port is specified, the script will hide the console window and run in the system tray. You can quit the application from the tray icon.
|
||||
|
||||
## Notes
|
||||
|
||||
- Ensure that your ESP32 device is connected to your computer via USB.
|
||||
- The script captures a small region of the screen to detect the mute and deafen status. Adjust the coordinates and dimensions in the script if necessary.
|
||||
|
||||
## License
|
||||
|
||||
This project is licensed under the MIT License.
|
||||
Binary file not shown.
|
Before Width: | Height: | Size: 69 B After Width: | Height: | Size: 99 B |
83
main.py
83
main.py
@ -2,13 +2,21 @@ 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
|
||||
import sys
|
||||
import pystray
|
||||
from PIL import Image, ImageDraw
|
||||
import threading
|
||||
import ctypes
|
||||
|
||||
# Set the title for the PowerShell window
|
||||
ctypes.windll.kernel32.SetConsoleTitleW("ESP32 Discord Controller")
|
||||
|
||||
def get_serial_port():
|
||||
if len(sys.argv) > 1 and sys.argv[1].startswith("-com="):
|
||||
return sys.argv[1].split("=")[1]
|
||||
|
||||
ports = list(list_ports.comports())
|
||||
if not ports:
|
||||
print("No serial ports found. Please connect a device.")
|
||||
@ -20,14 +28,15 @@ def get_serial_port():
|
||||
return ports[choice].device
|
||||
|
||||
x = -1772
|
||||
y = 1059
|
||||
x2 = -1745
|
||||
y2 = 1064
|
||||
width = 1
|
||||
height = 1
|
||||
y = 1064
|
||||
x2 = -1746
|
||||
y2 = 1063
|
||||
width = 4
|
||||
height = 4
|
||||
expected_r = 242
|
||||
expected_g = 63
|
||||
expected_b = 67
|
||||
grid = 4
|
||||
|
||||
def get_discord_status():
|
||||
with mss.mss() as sct:
|
||||
@ -47,16 +56,57 @@ def get_discord_status():
|
||||
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)
|
||||
# Check the pixel color in a 2x2 region
|
||||
mute_status = any(
|
||||
(mute_image[i, j, 2] == expected_r and
|
||||
mute_image[i, j, 1] == expected_g and
|
||||
mute_image[i, j, 0] == expected_b)
|
||||
for i in range(grid) for j in range(grid)
|
||||
)
|
||||
deafen_status = any(
|
||||
(deafen_image[i, j, 2] == expected_r and
|
||||
deafen_image[i, j, 1] == expected_g and
|
||||
deafen_image[i, j, 0] == expected_b)
|
||||
for i in range(grid) for j in range(grid)
|
||||
)
|
||||
return mute_status, deafen_status
|
||||
|
||||
def create_image():
|
||||
# Generate an image for the system tray icon
|
||||
width = 64
|
||||
height = 64
|
||||
image = Image.new('RGB', (width, height), (255, 255, 255))
|
||||
dc = ImageDraw.Draw(image)
|
||||
dc.rectangle(
|
||||
[(width // 2, 0), (width, height // 2)],
|
||||
fill="black")
|
||||
dc.rectangle(
|
||||
[(0, height // 2), (width // 2, height)],
|
||||
fill="black")
|
||||
return image
|
||||
|
||||
def on_quit(icon, item):
|
||||
icon.stop()
|
||||
if 'ser' in globals() and ser.is_open:
|
||||
ser.close()
|
||||
print("Serial connection closed.")
|
||||
sys.exit(0)
|
||||
|
||||
def hide_console():
|
||||
whnd = ctypes.windll.kernel32.GetConsoleWindow()
|
||||
if whnd != 0:
|
||||
ctypes.windll.user32.ShowWindow(whnd, 0)
|
||||
ctypes.windll.kernel32.CloseHandle(whnd)
|
||||
|
||||
def hide_in_tray():
|
||||
hide_console()
|
||||
icon = pystray.Icon("ESP32-discord")
|
||||
icon.icon = create_image()
|
||||
icon.menu = pystray.Menu(pystray.MenuItem('Quit', on_quit))
|
||||
threading.Thread(target=icon.run).start()
|
||||
|
||||
def main():
|
||||
global ser
|
||||
port = get_serial_port()
|
||||
if not port:
|
||||
return
|
||||
@ -70,6 +120,9 @@ def main():
|
||||
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'))
|
||||
|
||||
if len(sys.argv) > 1 and sys.argv[1].startswith("-com="):
|
||||
hide_in_tray()
|
||||
|
||||
while True:
|
||||
try:
|
||||
if ser.in_waiting > 0:
|
||||
@ -103,7 +156,7 @@ def main():
|
||||
except serial.SerialException as e:
|
||||
print(f"Could not open serial port: {e}")
|
||||
finally:
|
||||
if 'ser' in locals() and ser.is_open:
|
||||
if 'ser' in globals() and ser.is_open:
|
||||
ser.close()
|
||||
print("Serial connection closed.")
|
||||
|
||||
|
||||
Binary file not shown.
|
Before Width: | Height: | Size: 69 B After Width: | Height: | Size: 110 B |
Loading…
x
Reference in New Issue
Block a user