adding country list
All checks were successful
Build and Deploy Docker Container / build-and-deploy (push) Successful in 44s

This commit is contained in:
2025-10-04 18:18:26 +02:00
parent 5b81106015
commit 36a7b8bcf1
4 changed files with 145973 additions and 10 deletions

96
main.py
View File

@@ -1,7 +1,8 @@
import os import os
import pytz
from datetime import datetime
import time import time
import logging import logging
import random
import requests import requests
import schedule import schedule
from dotenv import load_dotenv from dotenv import load_dotenv
@@ -17,13 +18,12 @@ load_dotenv()
WEBHOOK_URL = os.getenv('DISCORD_WEBHOOK_URL') WEBHOOK_URL = os.getenv('DISCORD_WEBHOOK_URL')
MSG_FOOTER = "THC - Toke Hash Coordinated | GIF via Tenor" MSG_FOOTER = "THC - Toke Hash Coordinated"
MSG_TEST = "Discord 420 timer activated. This is a test notification."
MSG_REMINDER = "This is your 5 minute reminder to 420!" MSG_REMINDER = "This is your 5 minute reminder to 420!"
MSG_HALFTIME_REMINDER = "Half-time in 5 minutes!" MSG_HALFTIME_REMINDER = "Half-time in 5 minutes!"
MSG_HALFTIME = "Half-time!" MSG_HALFTIME = "Half-time!"
MSG_NOTIFICATION = "420! Blaze it!" MSG_NOTIFICATION = "Blaze it!"
COL_BLUE = 0x3498db COL_BLUE = 0x3498db
COL_ORANGE = 0xe67e22 COL_ORANGE = 0xe67e22
@@ -31,15 +31,56 @@ COL_GREEN = 0x2ecc71
COL_UNKNOWN = 0x95a5a6 COL_UNKNOWN = 0x95a5a6
messages = { messages = {
"test": {"text": MSG_TEST, "color": COL_BLUE},
"reminder_halftime": {"text": MSG_HALFTIME_REMINDER, "color": COL_ORANGE}, "reminder_halftime": {"text": MSG_HALFTIME_REMINDER, "color": COL_ORANGE},
"halftime": {"text": MSG_HALFTIME, "color": COL_GREEN}, "halftime": {"text": MSG_HALFTIME, "color": COL_GREEN},
"reminder": {"text": MSG_REMINDER, "color": COL_ORANGE}, "reminder": {"text": MSG_REMINDER, "color": COL_ORANGE},
"notification": {"text": MSG_NOTIFICATION, "color": COL_GREEN}, "420": {"text": MSG_NOTIFICATION, "color": COL_GREEN},
"unknown": {"text": "Unknown notification type", "color": COL_UNKNOWN} "unknown": {"text": "Unknown notification type", "color": COL_UNKNOWN}
} }
def load_timezones() -> list[dict]:
"""Load timezones from csv file."""
# Read the CSV file and return a list of timezones
with open("tzdb/TimeZoneDB.csv/time_zone.csv", "r", encoding="utf-8") as f:
lines = f.readlines()
# Fields: zone_name,country_code,abbreviation,time_start,gmt_offset,dst
timezones = []
for line in lines:
fields = line.strip().split(",")
if len(fields) >= 5:
timezones.append({
"zone_name": fields[0],
"country_code": fields[1],
"abbreviation": fields[2],
"time_start": fields[3],
"gmt_offset": int(fields[4]),
"dst": fields[5] == '1'
})
return timezones
def load_countries() -> list[dict]:
"""Load countries from csv file."""
# Read the CSV file and return a list of countries
with open("tzdb/TimeZoneDB.csv/country.csv", "r", encoding="utf-8") as f:
lines = f.readlines()
# Fields: country_code,country_name
countries = []
for line in lines:
fields = line.strip().split(",")
if len(fields) >= 2:
countries.append({
"country_code": fields[0],
"country_name": fields[1]
})
return countries
timezones = load_timezones()
countries = load_countries()
def get_message(type: str) -> dict[str, int]: def get_message(type: str) -> dict[str, int]:
""" """
Get the notification message based on the type. Get the notification message based on the type.
@@ -47,9 +88,16 @@ def get_message(type: str) -> dict[str, int]:
msg = messages["unknown"] msg = messages["unknown"]
if type in messages: if type in messages:
msg = messages[type] msg = messages[type]
if type in ["halftime", "notification"]: if type in ["halftime", "420"]:
msg["image"] = { msg["image"] = {
"url": "https://www.freepnglogos.com/uploads/weed-leaf-png/cannabis-weed-leaf-png-clipart-images-24.png"} "url": "https://www.freepnglogos.com/uploads/weed-leaf-png/cannabis-weed-leaf-png-clipart-images-24.png"}
if type == "420":
tz_list = where_is_it_420(timezones, countries)
if tz_list:
tz_str = "\n".join(tz_list)
msg["text"] += f"\nIt's 4:20 in:\n{tz_str}"
else:
msg["text"] += " It's not 4:20 anywhere right now."
return msg return msg
@@ -91,19 +139,49 @@ def send_notification(message: str) -> None:
logging.error(f"Error sending notification: {e}") logging.error(f"Error sending notification: {e}")
def get_tz_info(tz_name: str, timezones: list[dict]) -> dict | None:
"""Get timezone info by name."""
return next((tz for tz in timezones if tz["zone_name"] == tz_name), None)
def get_country_info(country_code: str, countries: list[dict]) -> dict | None:
"""Get country info by country code."""
return next((c for c in countries if c["country_code"] == country_code), None)
def where_is_it_420(timezones: list[dict], countries: list[dict]) -> list[str]:
"""Get timezones where the current hour is 4 or 16, indicating it's 4:20 there.
Returns:
list[str]: A list of timezones where it's currently 4:20 PM or AM.
"""
tz_list = []
for tz in pytz.all_timezones:
now = datetime.now(pytz.timezone(tz))
if now.hour == 4 or now.hour == 16:
# Find the timezone in the loaded timezones
tz_info = get_tz_info(tz, timezones)
if tz_info:
country = get_country_info(tz_info["country_code"], countries)
if country and country["country_name"] not in tz_list:
country_name = country["country_name"].strip().strip('"')
tz_list.append(country_name)
return tz_list
def main() -> None: def main() -> None:
""" """
Main function to run the scheduler. Main function to run the scheduler.
""" """
# Schedule notifications # Schedule notifications
schedule.every().hour.at(":15").do(send_notification, "reminder") schedule.every().hour.at(":15").do(send_notification, "reminder")
schedule.every().hour.at(":20").do(send_notification, "notification") schedule.every().hour.at(":20").do(send_notification, "420")
schedule.every().hour.at(":45").do(send_notification, "reminder_halftime") schedule.every().hour.at(":45").do(send_notification, "reminder_halftime")
schedule.every().hour.at(":50").do(send_notification, "halftime") schedule.every().hour.at(":50").do(send_notification, "halftime")
logging.info("Scheduler started.") logging.info("Scheduler started.")
# Test the notification on startup # Test the notification on startup
send_notification("test") send_notification("420")
try: try:
while True: while True:

View File

@@ -1,3 +1,4 @@
requests
python-dotenv python-dotenv
pytz
requests
schedule schedule

View File

@@ -0,0 +1,247 @@
AF,Afghanistan
AL,Albania
DZ,Algeria
AS,American Samoa
AD,Andorra
AO,Angola
AI,Anguilla
AQ,Antarctica
AG,Antigua and Barbuda
AR,Argentina
AM,Armenia
AW,Aruba
AU,Australia
AT,Austria
AZ,Azerbaijan
BS,Bahamas
BH,Bahrain
BD,Bangladesh
BB,Barbados
BY,Belarus
BE,Belgium
BZ,Belize
BJ,Benin
BM,Bermuda
BT,Bhutan
BO,"Bolivia, Plurinational State of"
BQ,"Bonaire, Sint Eustatius and Saba"
BA,Bosnia and Herzegovina
BW,Botswana
BR,Brazil
IO,British Indian Ocean Territory
BN,Brunei Darussalam
BG,Bulgaria
BF,Burkina Faso
BI,Burundi
KH,Cambodia
CM,Cameroon
CA,Canada
CV,Cape Verde
KY,Cayman Islands
CF,Central African Republic
TD,Chad
CL,Chile
CN,China
CX,Christmas Island
CC,Cocos (Keeling) Islands
CO,Colombia
KM,Comoros
CG,Congo
CD,"Congo, the Democratic Republic of the"
CK,Cook Islands
CR,Costa Rica
HR,Croatia
CU,Cuba
CW,Curaçao
CY,Cyprus
CZ,Czech Republic
CI,Côte d'Ivoire
DK,Denmark
DJ,Djibouti
DM,Dominica
DO,Dominican Republic
EC,Ecuador
EG,Egypt
SV,El Salvador
GQ,Equatorial Guinea
ER,Eritrea
EE,Estonia
ET,Ethiopia
FK,Falkland Islands (Malvinas)
FO,Faroe Islands
FJ,Fiji
FI,Finland
FR,France
GF,French Guiana
PF,French Polynesia
TF,French Southern Territories
GA,Gabon
GM,Gambia
GE,Georgia
DE,Germany
GH,Ghana
GI,Gibraltar
GR,Greece
GL,Greenland
GD,Grenada
GP,Guadeloupe
GU,Guam
GT,Guatemala
GG,Guernsey
GN,Guinea
GW,Guinea-Bissau
GY,Guyana
HT,Haiti
VA,Holy See (Vatican City State)
HN,Honduras
HK,Hong Kong
HU,Hungary
IS,Iceland
IN,India
ID,Indonesia
IR,"Iran, Islamic Republic of"
IQ,Iraq
IE,Ireland
IM,Isle of Man
IL,Israel
IT,Italy
JM,Jamaica
JP,Japan
JE,Jersey
JO,Jordan
KZ,Kazakhstan
KE,Kenya
KI,Kiribati
KP,"Korea, Democratic People's Republic of"
KR,"Korea, Republic of"
KW,Kuwait
KG,Kyrgyzstan
LA,Lao People's Democratic Republic
LV,Latvia
LB,Lebanon
LS,Lesotho
LR,Liberia
LY,Libya
LI,Liechtenstein
LT,Lithuania
LU,Luxembourg
MO,Macao
MK,"Macedonia, the Former Yugoslav Republic of"
MG,Madagascar
MW,Malawi
MY,Malaysia
MV,Maldives
ML,Mali
MT,Malta
MH,Marshall Islands
MQ,Martinique
MR,Mauritania
MU,Mauritius
YT,Mayotte
MX,Mexico
FM,"Micronesia, Federated States of"
MD,"Moldova, Republic of"
MC,Monaco
MN,Mongolia
ME,Montenegro
MS,Montserrat
MA,Morocco
MZ,Mozambique
MM,Myanmar
NA,Namibia
NR,Nauru
NP,Nepal
NL,Netherlands
NC,New Caledonia
NZ,New Zealand
NI,Nicaragua
NE,Niger
NG,Nigeria
NU,Niue
NF,Norfolk Island
MP,Northern Mariana Islands
NO,Norway
OM,Oman
PK,Pakistan
PW,Palau
PS,"Palestine, State of"
PA,Panama
PG,Papua New Guinea
PY,Paraguay
PE,Peru
PH,Philippines
PN,Pitcairn
PL,Poland
PT,Portugal
PR,Puerto Rico
QA,Qatar
RO,Romania
RU,Russian Federation
RW,Rwanda
RE,Réunion
BL,Saint Barthélemy
SH,"Saint Helena, Ascension and Tristan da Cunha"
KN,Saint Kitts and Nevis
LC,Saint Lucia
MF,Saint Martin (French part)
PM,Saint Pierre and Miquelon
VC,Saint Vincent and the Grenadines
WS,Samoa
SM,San Marino
ST,Sao Tome and Principe
SA,Saudi Arabia
SN,Senegal
RS,Serbia
SC,Seychelles
SL,Sierra Leone
SG,Singapore
SX,Sint Maarten (Dutch part)
SK,Slovakia
SI,Slovenia
SB,Solomon Islands
SO,Somalia
ZA,South Africa
GS,South Georgia and the South Sandwich Islands
SS,South Sudan
ES,Spain
LK,Sri Lanka
SD,Sudan
SR,Suriname
SJ,Svalbard and Jan Mayen
SZ,Swaziland
SE,Sweden
CH,Switzerland
SY,Syrian Arab Republic
TW,"Taiwan, Province of China"
TJ,Tajikistan
TZ,"Tanzania, United Republic of"
TH,Thailand
TL,Timor-Leste
TG,Togo
TK,Tokelau
TO,Tonga
TT,Trinidad and Tobago
TN,Tunisia
TR,Turkey
TM,Turkmenistan
TC,Turks and Caicos Islands
TV,Tuvalu
UG,Uganda
UA,Ukraine
AE,United Arab Emirates
GB,United Kingdom
US,United States
UM,United States Minor Outlying Islands
UY,Uruguay
UZ,Uzbekistan
VU,Vanuatu
VE,"Venezuela, Bolivarian Republic of"
VN,Viet Nam
VG,"Virgin Islands, British"
VI,"Virgin Islands, U.S."
WF,Wallis and Futuna
EH,Western Sahara
YE,Yemen
ZM,Zambia
ZW,Zimbabwe
AX,Åland Islands
1 AF Afghanistan
2 AL Albania
3 DZ Algeria
4 AS American Samoa
5 AD Andorra
6 AO Angola
7 AI Anguilla
8 AQ Antarctica
9 AG Antigua and Barbuda
10 AR Argentina
11 AM Armenia
12 AW Aruba
13 AU Australia
14 AT Austria
15 AZ Azerbaijan
16 BS Bahamas
17 BH Bahrain
18 BD Bangladesh
19 BB Barbados
20 BY Belarus
21 BE Belgium
22 BZ Belize
23 BJ Benin
24 BM Bermuda
25 BT Bhutan
26 BO Bolivia, Plurinational State of
27 BQ Bonaire, Sint Eustatius and Saba
28 BA Bosnia and Herzegovina
29 BW Botswana
30 BR Brazil
31 IO British Indian Ocean Territory
32 BN Brunei Darussalam
33 BG Bulgaria
34 BF Burkina Faso
35 BI Burundi
36 KH Cambodia
37 CM Cameroon
38 CA Canada
39 CV Cape Verde
40 KY Cayman Islands
41 CF Central African Republic
42 TD Chad
43 CL Chile
44 CN China
45 CX Christmas Island
46 CC Cocos (Keeling) Islands
47 CO Colombia
48 KM Comoros
49 CG Congo
50 CD Congo, the Democratic Republic of the
51 CK Cook Islands
52 CR Costa Rica
53 HR Croatia
54 CU Cuba
55 CW Curaçao
56 CY Cyprus
57 CZ Czech Republic
58 CI Côte d'Ivoire
59 DK Denmark
60 DJ Djibouti
61 DM Dominica
62 DO Dominican Republic
63 EC Ecuador
64 EG Egypt
65 SV El Salvador
66 GQ Equatorial Guinea
67 ER Eritrea
68 EE Estonia
69 ET Ethiopia
70 FK Falkland Islands (Malvinas)
71 FO Faroe Islands
72 FJ Fiji
73 FI Finland
74 FR France
75 GF French Guiana
76 PF French Polynesia
77 TF French Southern Territories
78 GA Gabon
79 GM Gambia
80 GE Georgia
81 DE Germany
82 GH Ghana
83 GI Gibraltar
84 GR Greece
85 GL Greenland
86 GD Grenada
87 GP Guadeloupe
88 GU Guam
89 GT Guatemala
90 GG Guernsey
91 GN Guinea
92 GW Guinea-Bissau
93 GY Guyana
94 HT Haiti
95 VA Holy See (Vatican City State)
96 HN Honduras
97 HK Hong Kong
98 HU Hungary
99 IS Iceland
100 IN India
101 ID Indonesia
102 IR Iran, Islamic Republic of
103 IQ Iraq
104 IE Ireland
105 IM Isle of Man
106 IL Israel
107 IT Italy
108 JM Jamaica
109 JP Japan
110 JE Jersey
111 JO Jordan
112 KZ Kazakhstan
113 KE Kenya
114 KI Kiribati
115 KP Korea, Democratic People's Republic of
116 KR Korea, Republic of
117 KW Kuwait
118 KG Kyrgyzstan
119 LA Lao People's Democratic Republic
120 LV Latvia
121 LB Lebanon
122 LS Lesotho
123 LR Liberia
124 LY Libya
125 LI Liechtenstein
126 LT Lithuania
127 LU Luxembourg
128 MO Macao
129 MK Macedonia, the Former Yugoslav Republic of
130 MG Madagascar
131 MW Malawi
132 MY Malaysia
133 MV Maldives
134 ML Mali
135 MT Malta
136 MH Marshall Islands
137 MQ Martinique
138 MR Mauritania
139 MU Mauritius
140 YT Mayotte
141 MX Mexico
142 FM Micronesia, Federated States of
143 MD Moldova, Republic of
144 MC Monaco
145 MN Mongolia
146 ME Montenegro
147 MS Montserrat
148 MA Morocco
149 MZ Mozambique
150 MM Myanmar
151 NA Namibia
152 NR Nauru
153 NP Nepal
154 NL Netherlands
155 NC New Caledonia
156 NZ New Zealand
157 NI Nicaragua
158 NE Niger
159 NG Nigeria
160 NU Niue
161 NF Norfolk Island
162 MP Northern Mariana Islands
163 NO Norway
164 OM Oman
165 PK Pakistan
166 PW Palau
167 PS Palestine, State of
168 PA Panama
169 PG Papua New Guinea
170 PY Paraguay
171 PE Peru
172 PH Philippines
173 PN Pitcairn
174 PL Poland
175 PT Portugal
176 PR Puerto Rico
177 QA Qatar
178 RO Romania
179 RU Russian Federation
180 RW Rwanda
181 RE Réunion
182 BL Saint Barthélemy
183 SH Saint Helena, Ascension and Tristan da Cunha
184 KN Saint Kitts and Nevis
185 LC Saint Lucia
186 MF Saint Martin (French part)
187 PM Saint Pierre and Miquelon
188 VC Saint Vincent and the Grenadines
189 WS Samoa
190 SM San Marino
191 ST Sao Tome and Principe
192 SA Saudi Arabia
193 SN Senegal
194 RS Serbia
195 SC Seychelles
196 SL Sierra Leone
197 SG Singapore
198 SX Sint Maarten (Dutch part)
199 SK Slovakia
200 SI Slovenia
201 SB Solomon Islands
202 SO Somalia
203 ZA South Africa
204 GS South Georgia and the South Sandwich Islands
205 SS South Sudan
206 ES Spain
207 LK Sri Lanka
208 SD Sudan
209 SR Suriname
210 SJ Svalbard and Jan Mayen
211 SZ Swaziland
212 SE Sweden
213 CH Switzerland
214 SY Syrian Arab Republic
215 TW Taiwan, Province of China
216 TJ Tajikistan
217 TZ Tanzania, United Republic of
218 TH Thailand
219 TL Timor-Leste
220 TG Togo
221 TK Tokelau
222 TO Tonga
223 TT Trinidad and Tobago
224 TN Tunisia
225 TR Turkey
226 TM Turkmenistan
227 TC Turks and Caicos Islands
228 TV Tuvalu
229 UG Uganda
230 UA Ukraine
231 AE United Arab Emirates
232 GB United Kingdom
233 US United States
234 UM United States Minor Outlying Islands
235 UY Uruguay
236 UZ Uzbekistan
237 VU Vanuatu
238 VE Venezuela, Bolivarian Republic of
239 VN Viet Nam
240 VG Virgin Islands, British
241 VI Virgin Islands, U.S.
242 WF Wallis and Futuna
243 EH Western Sahara
244 YE Yemen
245 ZM Zambia
246 ZW Zimbabwe
247 AX Åland Islands

File diff suppressed because it is too large Load Diff