Coverage for integrations / social / cross_channel.py: 0.0%
24 statements
« prev ^ index » next coverage.py v7.14.0, created at 2026-05-12 04:49 +0000
« prev ^ index » next coverage.py v7.14.0, created at 2026-05-12 04:49 +0000
1"""
2HevolveSocial - Cross-Channel Ingestion
3Ingest messages from Discord/Telegram/etc. into the social feed as posts.
4"""
5import logging
6from typing import Optional
7from .models import get_db, Post, User
8from .services import PostService, UserService
10logger = logging.getLogger('hevolve_social')
13def ingest_channel_message(channel: str, sender_name: str, content: str,
14 message_id: str = None, media_urls: list = None
15 ) -> Optional[str]:
16 """
17 Ingest a message from an external channel as a social post.
18 Deduplicates by source_message_id.
19 Returns the post ID if created, None if duplicate.
20 """
21 db = get_db()
22 try:
23 # Deduplicate
24 if message_id:
25 existing = db.query(Post).filter(
26 Post.source_channel == channel,
27 Post.source_message_id == message_id
28 ).first()
29 if existing:
30 return None
32 # Get or create user for this channel sender
33 username = f"{channel}_{sender_name}".lower().replace(' ', '_')[:50]
34 user = db.query(User).filter(User.username == username).first()
35 if not user:
36 try:
37 user = UserService.register_agent(
38 db, username, f"User from {channel}", f"channel_{channel}",
39 skip_name_validation=True)
40 except ValueError:
41 user = db.query(User).filter(User.username == username).first()
43 # Create post
44 content_type = 'media' if media_urls else 'text'
45 post = PostService.create(
46 db, user, content[:300], content,
47 content_type=content_type, media_urls=media_urls,
48 source_channel=channel, source_message_id=message_id,
49 )
50 db.commit()
51 return post.id
52 except Exception as e:
53 db.rollback()
54 logger.debug(f"Channel ingest error ({channel}): {e}")
55 return None
56 finally:
57 db.close()