hungerlib 4.24.dev10__tar.gz → 4.24.dev12__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {hungerlib-4.24.dev10/src/hungerlib.egg-info → hungerlib-4.24.dev12}/PKG-INFO +1 -1
- {hungerlib-4.24.dev10 → hungerlib-4.24.dev12}/pyproject.toml +1 -1
- hungerlib-4.24.dev12/src/hungerlib/email/email_templates/restart.html +16 -0
- {hungerlib-4.24.dev10 → hungerlib-4.24.dev12}/src/hungerlib/email/manager.py +17 -3
- {hungerlib-4.24.dev10 → hungerlib-4.24.dev12/src/hungerlib.egg-info}/PKG-INFO +1 -1
- hungerlib-4.24.dev10/src/hungerlib/email/email_templates/restart.html +0 -21
- {hungerlib-4.24.dev10 → hungerlib-4.24.dev12}/LICENSE +0 -0
- {hungerlib-4.24.dev10 → hungerlib-4.24.dev12}/README.md +0 -0
- {hungerlib-4.24.dev10 → hungerlib-4.24.dev12}/setup.cfg +0 -0
- {hungerlib-4.24.dev10 → hungerlib-4.24.dev12}/src/hungerlib/__init__.py +0 -0
- {hungerlib-4.24.dev10 → hungerlib-4.24.dev12}/src/hungerlib/api/__init__.py +0 -0
- {hungerlib-4.24.dev10 → hungerlib-4.24.dev12}/src/hungerlib/api/backups.py +0 -0
- {hungerlib-4.24.dev10 → hungerlib-4.24.dev12}/src/hungerlib/api/command.py +0 -0
- {hungerlib-4.24.dev10 → hungerlib-4.24.dev12}/src/hungerlib/api/databases.py +0 -0
- {hungerlib-4.24.dev10 → hungerlib-4.24.dev12}/src/hungerlib/api/filemanager.py +0 -0
- {hungerlib-4.24.dev10 → hungerlib-4.24.dev12}/src/hungerlib/api/schedule.py +0 -0
- {hungerlib-4.24.dev10 → hungerlib-4.24.dev12}/src/hungerlib/api/startup.py +0 -0
- {hungerlib-4.24.dev10 → hungerlib-4.24.dev12}/src/hungerlib/bridgeclient.py +0 -0
- {hungerlib-4.24.dev10 → hungerlib-4.24.dev12}/src/hungerlib/configloader.py +0 -0
- {hungerlib-4.24.dev10 → hungerlib-4.24.dev12}/src/hungerlib/discord_bot_webhook.py +0 -0
- {hungerlib-4.24.dev10 → hungerlib-4.24.dev12}/src/hungerlib/email/__init__.py +0 -0
- {hungerlib-4.24.dev10 → hungerlib-4.24.dev12}/src/hungerlib/email/client.py +0 -0
- {hungerlib-4.24.dev10 → hungerlib-4.24.dev12}/src/hungerlib/email/message.py +0 -0
- {hungerlib-4.24.dev10 → hungerlib-4.24.dev12}/src/hungerlib/messagerouter.py +0 -0
- {hungerlib-4.24.dev10 → hungerlib-4.24.dev12}/src/hungerlib/panel.py +0 -0
- {hungerlib-4.24.dev10 → hungerlib-4.24.dev12}/src/hungerlib/servers/__init__.py +0 -0
- {hungerlib-4.24.dev10 → hungerlib-4.24.dev12}/src/hungerlib/servers/generic.py +0 -0
- {hungerlib-4.24.dev10 → hungerlib-4.24.dev12}/src/hungerlib/servers/minecraft.py +0 -0
- {hungerlib-4.24.dev10 → hungerlib-4.24.dev12}/src/hungerlib/utils/__init__.py +0 -0
- {hungerlib-4.24.dev10 → hungerlib-4.24.dev12}/src/hungerlib/utils/exceptions.py +0 -0
- {hungerlib-4.24.dev10 → hungerlib-4.24.dev12}/src/hungerlib/utils/time.py +0 -0
- {hungerlib-4.24.dev10 → hungerlib-4.24.dev12}/src/hungerlib/utils/utils.py +0 -0
- {hungerlib-4.24.dev10 → hungerlib-4.24.dev12}/src/hungerlib/validator.py +0 -0
- {hungerlib-4.24.dev10 → hungerlib-4.24.dev12}/src/hungerlib.egg-info/SOURCES.txt +0 -0
- {hungerlib-4.24.dev10 → hungerlib-4.24.dev12}/src/hungerlib.egg-info/dependency_links.txt +0 -0
- {hungerlib-4.24.dev10 → hungerlib-4.24.dev12}/src/hungerlib.egg-info/requires.txt +0 -0
- {hungerlib-4.24.dev10 → hungerlib-4.24.dev12}/src/hungerlib.egg-info/top_level.txt +0 -0
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
<div style="background:#fff; border-radius:10px; padding:20px; max-width:600px; margin:0 auto;
|
|
2
|
+
box-shadow:0 6px 18px rgba(0,0,0,0.06); font-family: Arial, sans-serif;">
|
|
3
|
+
|
|
4
|
+
<h1 style="color:#2b6df6; margin-bottom:20px;">
|
|
5
|
+
Server {{ server_name }} Restart Scheduled
|
|
6
|
+
</h1>
|
|
7
|
+
|
|
8
|
+
<p style="color:#333; font-size:16px; line-height:1.6;">
|
|
9
|
+
The server <strong>{{ server_name }}</strong> will restart at <strong>{{ time }}</strong>.
|
|
10
|
+
</p>
|
|
11
|
+
|
|
12
|
+
<p style="font-size:13px; color:#666; margin-top:12px;">
|
|
13
|
+
Triggered by: {{ trigger }}
|
|
14
|
+
</p>
|
|
15
|
+
|
|
16
|
+
</div>
|
|
@@ -3,16 +3,26 @@ import pathlib
|
|
|
3
3
|
from cloudflare import Cloudflare
|
|
4
4
|
from .message import Email
|
|
5
5
|
|
|
6
|
-
|
|
6
|
+
# Templates live in: src/hungerlib/email/email_templates
|
|
7
|
+
TEMPLATE_DIR = pathlib.Path(__file__).resolve().parent / "email_templates"
|
|
7
8
|
|
|
8
9
|
class EmailManager:
|
|
10
|
+
"""
|
|
11
|
+
Backend email system.
|
|
12
|
+
Holds API token and account ID.
|
|
13
|
+
Sends emails created by EmailClient.
|
|
14
|
+
"""
|
|
15
|
+
|
|
9
16
|
def __init__(self, api_token: str, account_id: str):
|
|
10
17
|
self.client = Cloudflare(api_token=api_token)
|
|
11
18
|
self.account_id = account_id
|
|
12
19
|
|
|
20
|
+
# Jinja2 environment configured for HTML emails
|
|
13
21
|
self.jinja = Environment(
|
|
14
22
|
loader=FileSystemLoader(str(TEMPLATE_DIR)),
|
|
15
|
-
autoescape=
|
|
23
|
+
autoescape=False, # Cloudflare rejects escaped HTML
|
|
24
|
+
trim_blocks=False, # preserve whitespace
|
|
25
|
+
lstrip_blocks=False # preserve indentation
|
|
16
26
|
)
|
|
17
27
|
|
|
18
28
|
def render_template(self, template: str, ctx: dict) -> str:
|
|
@@ -20,6 +30,7 @@ class EmailManager:
|
|
|
20
30
|
return tmpl.render(**ctx)
|
|
21
31
|
|
|
22
32
|
def send_email(self, user, email: Email) -> bool:
|
|
33
|
+
# Render template if needed
|
|
23
34
|
if email.template and not email.html:
|
|
24
35
|
email.html = self.render_template(email.template, email.template_ctx)
|
|
25
36
|
|
|
@@ -34,6 +45,9 @@ class EmailManager:
|
|
|
34
45
|
payload["text"] = email.text
|
|
35
46
|
|
|
36
47
|
if email.html:
|
|
48
|
+
print("=== FINAL HTML SENT TO CLOUDFLARE ===")
|
|
49
|
+
print(email.html)
|
|
50
|
+
print("=====================================")
|
|
37
51
|
payload["html"] = email.html
|
|
38
52
|
|
|
39
53
|
if email.cc:
|
|
@@ -43,4 +57,4 @@ class EmailManager:
|
|
|
43
57
|
payload["bcc"] = ",".join(email.bcc)
|
|
44
58
|
|
|
45
59
|
resp = self.client.email_sending.send(**payload)
|
|
46
|
-
return bool(getattr(resp,
|
|
60
|
+
return bool(getattr(resp, "delivered", None))
|
|
@@ -1,21 +0,0 @@
|
|
|
1
|
-
<!doctype html>
|
|
2
|
-
<html>
|
|
3
|
-
<head>
|
|
4
|
-
<meta charset="utf-8">
|
|
5
|
-
<title>Server Restart</title>
|
|
6
|
-
<style>
|
|
7
|
-
body { font-family: Arial, sans-serif; background:#f4f6f9; margin:0; padding:20px; }
|
|
8
|
-
.card { background:#fff; border-radius:10px; padding:20px; max-width:600px; margin:0 auto; box-shadow:0 6px 18px rgba(0,0,0,0.06); }
|
|
9
|
-
h1 { color:#2b6df6; }
|
|
10
|
-
p { color:#333; }
|
|
11
|
-
.meta { font-size:13px; color:#666; margin-top:12px; }
|
|
12
|
-
</style>
|
|
13
|
-
</head>
|
|
14
|
-
<body>
|
|
15
|
-
<div class="card">
|
|
16
|
-
<h1>Server {{ server_name }} Restart Scheduled</h1>
|
|
17
|
-
<p>The server {{ server_name }} will restart at {{ time }}.</p>
|
|
18
|
-
<p class="meta">Triggered by: {{ trigger }}</p>
|
|
19
|
-
</div>
|
|
20
|
-
</body>
|
|
21
|
-
</html>
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|