Compare commits
	
		
			3 Commits
		
	
	
		
			8d7bc7e096
			...
			current
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| 9a4a8155e2 | |||
| 96b3f76ea2 | |||
| 91ff9625ec | 
							
								
								
									
										8
									
								
								.gitignore
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										8
									
								
								.gitignore
									
									
									
									
										vendored
									
									
								
							| @@ -1,7 +1 @@ | ||||
| *.txt | ||||
| *.sgf | ||||
| *.png | ||||
| *.out | ||||
| *.sh | ||||
| __pycache__/ | ||||
| rengobot_venv/ | ||||
| portable_python | ||||
							
								
								
									
										12
									
								
								README.md
									
									
									
									
									
								
							
							
						
						
									
										12
									
								
								README.md
									
									
									
									
									
								
							| @@ -1,12 +1,2 @@ | ||||
| A fork of  | ||||
| this is a repository of useful python scripts | ||||
|  | ||||
| https://github.com/ReneCareenium/rengobot | ||||
|  | ||||
| A discord bot for playing rengo games! | ||||
|  | ||||
| # Dependencies | ||||
| - sgf-render | ||||
| - python-discord | ||||
| - python-sgfmill | ||||
|  | ||||
| Make sure to run the bot in an environment with read/write permissions | ||||
							
								
								
									
										1
									
								
								caldav/htpasswd
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										1
									
								
								caldav/htpasswd
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1 @@ | ||||
| username:password | ||||
							
								
								
									
										26
									
								
								caldav/readme.md
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										26
									
								
								caldav/readme.md
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,26 @@ | ||||
|  | ||||
|  | ||||
| how to make python portable | ||||
|  | ||||
| https://chat.mistral.ai/chat/ab946d87-22e6-47d4-a99c-e8522c077347 | ||||
|  | ||||
| ``` | ||||
| wget https://www.python.org/ftp/python/3.13.7/Python-3.13.7.tgz | ||||
| tar -xzf Python-3.13.7.tgz | ||||
| rm Python-3.13.7.tgz | ||||
| cd Python-3.13.7 | ||||
| ./configure --enable-optimizations --with-ensurepip=install --prefix=$(pwd)/portable_python | ||||
| make -j$(nproc) | ||||
| make install | ||||
| # now in portable_python install packages that are needed | ||||
| ./portable_python/bin/pip3 install bcrypt | ||||
| ./portable_python/bin/pip3 install radicale | ||||
| cd .. | ||||
| mv Python-3.13.7/portable_python portable_python | ||||
| rm -rf Python-3.13.7  | ||||
| cd .. | ||||
| tar -czvf caldav.tar.gz caldav/ | ||||
| ``` | ||||
|  | ||||
|  | ||||
| tar -xzf caldav.tar.gz | ||||
							
								
								
									
										34
									
								
								caldav/server.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										34
									
								
								caldav/server.py
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,34 @@ | ||||
| from radicale import Application, config | ||||
| from wsgiref.simple_server import make_server | ||||
| import os | ||||
|  | ||||
| def run_server(): | ||||
|     # Load default configuration | ||||
|     configuration = config.load() | ||||
|  | ||||
|     # Customize settings | ||||
|     configuration.update({ | ||||
|         "server": { | ||||
|             "hosts": "0.0.0.0:5232",  # Listen on all interfaces | ||||
|         }, | ||||
|         | ||||
|         "storage": { | ||||
|             "filesystem_folder": "./calendars",  # Store calendars here | ||||
|         }, | ||||
|         "auth": { | ||||
|             "type": "htpasswd", | ||||
|             "htpasswd_filename": "./htpasswd",  # Path to htpasswd file | ||||
|             "htpasswd_encryption": "autodetect",  # or "sha1", "md5" (bcrypt is most secure) | ||||
|         }, | ||||
|        | ||||
|     }) | ||||
|  | ||||
|     # Create and run the app | ||||
|     app = Application(configuration=configuration) | ||||
|     server = make_server("0.0.0.0", 5232, app) | ||||
|     print("✅ Secure CalDAV server running on http://0.0.0.0:5232") | ||||
|     print("🔐 Authentication required. Default user: admin / password") | ||||
|     server.serve_forever() | ||||
|  | ||||
| if __name__ == "__main__": | ||||
|     run_server() | ||||
							
								
								
									
										2
									
								
								python_website_monitor/credentials.txt
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										2
									
								
								python_website_monitor/credentials.txt
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,2 @@ | ||||
| email | ||||
| password | ||||
							
								
								
									
										120
									
								
								python_website_monitor/server.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										120
									
								
								python_website_monitor/server.py
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,120 @@ | ||||
| import requests | ||||
| import time | ||||
| import smtplib | ||||
| from email.mime.text import MIMEText | ||||
| import sqlite3 | ||||
| from datetime import datetime, timedelta | ||||
|  | ||||
| def read_credentials(file_path): | ||||
|     with open(file_path, 'r') as file: | ||||
|         lines = file.readlines() | ||||
|         email = lines[0].strip() | ||||
|         password = lines[1].strip() | ||||
|     return email, password | ||||
|  | ||||
| def check_website(url, timeout=5): | ||||
|     try: | ||||
|         response = requests.get(url, timeout=timeout) | ||||
|         return response.status_code == 200 | ||||
|     except requests.RequestException: | ||||
|         return False | ||||
|  | ||||
| def send_email(subject, body, to_email, from_email, from_password, smtp_server): | ||||
|     msg = MIMEText(body) | ||||
|     msg['Subject'] = subject | ||||
|     msg['From'] = from_email | ||||
|     msg['To'] = to_email | ||||
|  | ||||
|     with smtplib.SMTP_SSL(smtp_server, 465) as server: | ||||
|         server.login(from_email, from_password) | ||||
|         server.sendmail(from_email, to_email, msg.as_string()) | ||||
|  | ||||
| def create_database(db_path): | ||||
|     conn = sqlite3.connect(db_path) | ||||
|     cursor = conn.cursor() | ||||
|     cursor.execute(''' | ||||
|         CREATE TABLE IF NOT EXISTS website_status ( | ||||
|             id INTEGER PRIMARY KEY AUTOINCREMENT, | ||||
|             timestamp DATETIME NOT NULL, | ||||
|             status INTEGER NOT NULL | ||||
|         ) | ||||
|     ''') | ||||
|     conn.commit() | ||||
|     conn.close() | ||||
|  | ||||
| def log_website_status(db_path, status): | ||||
|     conn = sqlite3.connect(db_path) | ||||
|     cursor = conn.cursor() | ||||
|     timestamp = datetime.now().strftime('%Y-%m-%d %H:%M:%S') | ||||
|     cursor.execute(''' | ||||
|         INSERT INTO website_status (timestamp, status) | ||||
|         VALUES (?, ?) | ||||
|     ''', (timestamp, 1 if status else 0)) | ||||
|     conn.commit() | ||||
|     conn.close() | ||||
|  | ||||
| def get_last_status(db_path): | ||||
|     conn = sqlite3.connect(db_path) | ||||
|     cursor = conn.cursor() | ||||
|     cursor.execute(''' | ||||
|         SELECT status FROM website_status | ||||
|         ORDER BY id DESC LIMIT 1 | ||||
|     ''') | ||||
|     result = cursor.fetchone() | ||||
|     conn.close() | ||||
|     return result[0] if result else None | ||||
|  | ||||
| def print_email_sent(status_str, timestamp): | ||||
|     print(f"[{timestamp}] Email sent: Website is now {status_str}") | ||||
|  | ||||
| def cleanup_old_logs(db_path, days_to_keep=10): | ||||
|     cutoff_date = (datetime.now() - timedelta(days=days_to_keep)).strftime('%Y-%m-%d %H:%M:%S') | ||||
|     conn = sqlite3.connect(db_path) | ||||
|     cursor = conn.cursor() | ||||
|     cursor.execute(''' | ||||
|         DELETE FROM website_status | ||||
|         WHERE timestamp < ? | ||||
|     ''', (cutoff_date,)) | ||||
|     deleted_rows = cursor.rowcount | ||||
|     conn.commit() | ||||
|     conn.close() | ||||
|     return deleted_rows | ||||
|  | ||||
| def main(): | ||||
|     url = "http://petrovv.com" | ||||
|     to_email = "nikola@petrovv.com" | ||||
|     check_interval = 600  # 10 minutes in seconds | ||||
|     credentials_file = "credentials.txt" | ||||
|     db_path = "website_status.db" | ||||
|     smtp_server = "mail.petrovv.com" | ||||
|  | ||||
|     create_database(db_path) | ||||
|     from_email, from_password = read_credentials(credentials_file) | ||||
|  | ||||
|     last_status = None | ||||
|     last_cleanup = datetime.now() | ||||
|  | ||||
|     while True: | ||||
|         current_time = datetime.now() | ||||
|         current_status = check_website(url) | ||||
|         log_website_status(db_path, current_status) | ||||
|  | ||||
|         if last_status is None or current_status != (last_status == 1): | ||||
|             status_str = "up" if current_status else "down" | ||||
|             subject = f"Website Status Change: {status_str}" | ||||
|             body = f"The website {url} is now {status_str} at {current_time.strftime('%Y-%m-%d %H:%M:%S')}." | ||||
|             send_email(subject, body, to_email, from_email, from_password, smtp_server) | ||||
|             print_email_sent(status_str, current_time.strftime('%Y-%m-%d %H:%M:%S')) | ||||
|             last_status = 1 if current_status else 0 | ||||
|  | ||||
|         # Perform cleanup once per day | ||||
|         if (current_time - last_cleanup).days >= 1: | ||||
|             deleted = cleanup_old_logs(db_path, 10) | ||||
|             if deleted > 0: | ||||
|                 print(f"[{current_time.strftime('%Y-%m-%d %H:%M:%S')}] Cleanup: Deleted {deleted} logs older than 10 days") | ||||
|             last_cleanup = current_time | ||||
|  | ||||
|         time.sleep(check_interval) | ||||
|  | ||||
| if __name__ == "__main__": | ||||
|     main() | ||||
							
								
								
									
										7
									
								
								rengobot/.gitignore
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										7
									
								
								rengobot/.gitignore
									
									
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,7 @@ | ||||
| *.txt | ||||
| *.sgf | ||||
| *.png | ||||
| *.out | ||||
| *.sh | ||||
| __pycache__/ | ||||
| rengobot_venv/ | ||||
							
								
								
									
										12
									
								
								rengobot/README.md
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										12
									
								
								rengobot/README.md
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,12 @@ | ||||
| A fork of  | ||||
|  | ||||
| https://github.com/ReneCareenium/rengobot | ||||
|  | ||||
| A discord bot for playing rengo games! | ||||
|  | ||||
| # Dependencies | ||||
| - sgf-render | ||||
| - python-discord | ||||
| - python-sgfmill | ||||
|  | ||||
| Make sure to run the bot in an environment with read/write permissions | ||||
		Reference in New Issue
	
	Block a user