90 lines
3 KiB
Python
90 lines
3 KiB
Python
'''Essentials for the bot to function'''
|
|
import configparser
|
|
import os
|
|
import sys
|
|
import argparse
|
|
|
|
def get_config_file_path():
|
|
"""Get config file path from command line arguments or default"""
|
|
parser = argparse.ArgumentParser(add_help=False) # Don't interfere with other argument parsing
|
|
parser.add_argument('--config', default='config.ini', help='Path to config file (default: config.ini)')
|
|
|
|
# Parse only known args to avoid conflicts with other argument parsing
|
|
args, _ = parser.parse_known_args()
|
|
return args.config
|
|
|
|
def load_config():
|
|
"""Load and validate config file with proper error handling"""
|
|
config_file = get_config_file_path()
|
|
config = configparser.ConfigParser()
|
|
|
|
# Check if config file exists
|
|
if not os.path.exists(config_file):
|
|
print(f"Error: {config_file} not found!")
|
|
if config_file == 'config.ini':
|
|
print("Please copy example_config.ini to config.ini and configure it.")
|
|
print(f"Or use --config /path/to/your/config.ini to specify a different location.")
|
|
sys.exit(1)
|
|
|
|
try:
|
|
config.read(config_file)
|
|
except configparser.Error as e:
|
|
print(f"Error reading {config_file}: {e}")
|
|
sys.exit(1)
|
|
|
|
# Check if [application] section exists
|
|
if 'application' not in config:
|
|
print(f"Error: [application] section missing in {config_file}")
|
|
sys.exit(1)
|
|
|
|
# Validate required fields
|
|
required_fields = ['BotUser', 'ApiKey', 'InstanceUrl', 'InstanceType', 'DatabaseLocation']
|
|
missing_fields = []
|
|
|
|
for field in required_fields:
|
|
if field not in config['application'] or not config['application'][field].strip():
|
|
missing_fields.append(field)
|
|
|
|
if missing_fields:
|
|
print(f"Error: Required fields missing in {config_file}: {', '.join(missing_fields)}")
|
|
sys.exit(1)
|
|
|
|
# Validate InstanceType
|
|
instance_type = config['application']['InstanceType'].lower()
|
|
if instance_type not in ('misskey', 'pleroma'):
|
|
print("Error: InstanceType must be either 'misskey' or 'pleroma'")
|
|
sys.exit(1)
|
|
|
|
return config
|
|
|
|
# Load and validate configuration
|
|
config = load_config()
|
|
|
|
# Username for the bot
|
|
USER = config['application']['BotUser']
|
|
|
|
# API key for the bot
|
|
KEY = config['application']['ApiKey']
|
|
|
|
# Bot's instance URL
|
|
INSTANCE = config['application']['InstanceUrl']
|
|
|
|
# SQLite Database location
|
|
DB_PATH = config['application']['DatabaseLocation']
|
|
|
|
# Instance type
|
|
INSTANCE_TYPE = config['application']['InstanceType'].lower()
|
|
|
|
# Web server port
|
|
WEB_PORT = config['application'].getint('WebPort', 5000)
|
|
|
|
# Trusted instances
|
|
trusted_instances_str = config['application'].get('TrustedInstances', '')
|
|
TRUSTED_INSTANCES = [instance.strip() for instance in trusted_instances_str.split(',') if instance.strip()]
|
|
|
|
# Extra stuff for control of the bot
|
|
|
|
# TODO: move this to db
|
|
# Fedi handles in the traditional 'user@domain.tld' style, allows these users
|
|
# to use extra admin exclusive commands with the bot'''
|
|
ADMINS = config['application'].get('DefaultAdmins', '[]')
|