Compare commits
	
		
			3 Commits
		
	
	
		
			8d7bc7e096
			...
			current
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| 9a4a8155e2 | |||
| 96b3f76ea2 | |||
| 91ff9625ec | 
							
								
								
									
										8
									
								
								.gitignore
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										8
									
								
								.gitignore
									
									
									
									
										vendored
									
									
								
							| @@ -1,7 +1 @@ | |||||||
| *.txt | portable_python | ||||||
| *.sgf |  | ||||||
| *.png |  | ||||||
| *.out |  | ||||||
| *.sh |  | ||||||
| __pycache__/ |  | ||||||
| rengobot_venv/ |  | ||||||
							
								
								
									
										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