fix(services): ensure session directory exists and handle container paths

This commit is contained in:
mamad
2026-08-27 20:42:23 +03:30
parent 4e807bbb7e
commit 76a19131a6
3 changed files with 24 additions and 23 deletions
+7 -8
View File
@@ -9,26 +9,28 @@ from core.metrics import POSTS_PUBLISHED_TOTAL, QUEUE_POSTS_GAUGE
logger = logging.getLogger(__name__)
SESSION_DIR = os.getenv("SESSION_DIR", "/app/sessions" if os.path.exists("/app") else "/projects/telegram-bots/copykar/sessions")
class PublisherService:
def __init__(
self,
repo: Repository,
api_id: Optional[int] = None,
api_hash: Optional[str] = None,
session_name: str = "/projects/telegram-bots/copykar/sessions/publisher.session",
session_name: Optional[str] = None,
bot_token: Optional[str] = None,
):
self.repo = repo
self.api_id = api_id or int(os.getenv("API_ID", "0"))
self.api_hash = api_hash or os.getenv("API_HASH", "")
self.bot_token = bot_token or os.getenv("BOT_TOKEN")
self.session_name = session_name
self.session_name = session_name or os.path.join(SESSION_DIR, "publisher.session")
os.makedirs(os.path.dirname(self.session_name), exist_ok=True)
self.client = TelegramClient(self.session_name, self.api_id, self.api_hash)
self._running = False
self._task: Optional[asyncio.Task] = None
async def start(self):
os.makedirs(os.path.dirname(self.session_name), exist_ok=True)
logger.info("Starting Publisher Service...")
if self.bot_token:
await self.client.start(bot_token=self.bot_token)
@@ -45,27 +47,24 @@ class PublisherService:
await self._process_pending_queues()
except Exception as e:
logger.error(f"Error in publisher loop: {e}", exc_info=True)
await asyncio.sleep(15) # Check queue every 15 seconds
await asyncio.sleep(15)
async def _process_pending_queues(self):
targets = await self.repo.get_active_targets()
now = datetime.now(timezone.utc)
# Update gauge metrics
pending_count = len(await self.repo.get_posts_by_status("approved", limit=5000))
QUEUE_POSTS_GAUGE.labels(status="approved").set(pending_count)
for target in targets:
# Check interval cooldown
if target.last_post_time:
last_post = target.last_post_time
if last_post.tzinfo is None:
last_post = last_post.replace(tzinfo=timezone.utc)
diff_minutes = (now - last_post).total_seconds() / 60.0
if diff_minutes < target.post_interval_min:
continue # Cooldown not elapsed yet
continue
# Fetch next approved post for this target
post = await self.repo.get_next_approved_post_for_target(target.id)
if not post:
continue