-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathwebhook.py
More file actions
112 lines (95 loc) · 4.71 KB
/
webhook.py
File metadata and controls
112 lines (95 loc) · 4.71 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
from __future__ import annotations
from pathlib import Path
from time import sleep
from typing import Any
from discord_webhook import DiscordWebhook
import src.files_handler as files_handler
from src.files_manipulator import upload_file_to_litterbox
_seconds = 1.0
class Webhook:
def __init__(
self,
directory: str,
url: str | list[str],
user: str | None = None,
extension: str | list[str] = "*",
*,
recursive: bool = False,
seconds: float = _seconds,
litterbox_mb_threshold: float = 25.0,
litterbox_extensions: list[str] | None = None,
**kwargs: dict[str, Any],
) -> None:
super().__init__()
self.webhook_urls: set[str] = set(url if isinstance(url, list) else [url])
self.directory: str = directory
self.extension: str | list[str] = extension
self.recursive: bool = recursive
self.seconds: float = seconds
self.webhooks: list[DiscordWebhook] = [
DiscordWebhook(
webhook_url,
rate_limit_retry=True,
username="New Files AutoSender",
**kwargs,
)
for webhook_url in self.webhook_urls
]
self.userPrefix: str = f"({user}) " if user else ""
self.litterboxThreshold: float = litterbox_mb_threshold * 1024 * 1024
self.litterboxExtensions: set[str] = {
litterboxExtension.lower().removeprefix(".") for litterboxExtension in litterbox_extensions or []
}
def send_message(self, message: str, file: Path | None = None) -> None:
message = f"{self.userPrefix}{message}"
for webhook in self.webhooks:
webhook.content = message
if not file:
_ = webhook.execute()
continue
if not file.is_file():
raise Exception(f"The path provided is not a file: {file}")
file_stats = file.stat()
if file_stats.st_size >= 1024**3:
print(f"{file.name} size is bigger than 1 GB! Skipped")
continue
print(f"Sending file: {file.name}")
if file_stats.st_size >= self.litterboxThreshold or (
self.litterboxExtensions
and file.suffix.lower().removeprefix(".") in self.litterboxExtensions
):
webhook.content += "\n" + upload_file_to_litterbox(file)
else:
webhook.add_file(file.read_bytes(), file.name)
_ = webhook.execute()
webhook.remove_files()
print(message)
def check_for_new_files(self, directory: str, extension: str | list[str], *, recursive: bool) -> None:
new_files = files_handler.glob_new_files(directory, extension, recursive=recursive)
if not new_files:
return
self.send_message("**New file(s) detected**")
for file in new_files:
file_path = Path(file)
file_size = -1
while files_handler.is_file_being_used(file_path, file_size):
print(f"Waiting for file to stop being used... {file}")
file_size = file_path.stat().st_size
sleep(0.5)
self.send_message(f"New file: `{file_path.name}`", file_path)
files_handler.update_file([file], should_append=True)
def mainloop(self) -> None:
self.send_message("Successfully started webhook")
while True:
sleep(self.seconds)
self.check_for_new_files(self.directory, self.extension, recursive=self.recursive)
if __name__ == "__main__":
import src.config as config
webhook = Webhook(
url=[config.WEBHOOK_URL],
directory=config.FILES_DIRECTORY,
extension=[config.FILES_EXTENSION, "m4a"],
recursive=config.RECURSIVE_DIRECTORIES,
litterbox_extensions=["mp4"],
)
webhook.mainloop()