def async_create_or_update_post(post, is_created): if not post.is_approved_by_moderator: send_telegram_message( chat=ADMIN_CHAT, text=render_html_message("moderator_new_post_review.html", post=post), reply_markup=telegram.InlineKeyboardMarkup([ *[ [telegram.InlineKeyboardButton(f"❌ {title}", callback_data=f"reject_post_{reason}:{post.id}")] for reason, title in REJECT_POST_REASONS.get(post.type) or [] ], [ telegram.InlineKeyboardButton("❌ В черновики", callback_data=f"reject_post:{post.id}"), telegram.InlineKeyboardButton("😕 Так себе", callback_data=f"forgive_post:{post.id}"), ], [ telegram.InlineKeyboardButton("👍 Одобрить", callback_data=f"approve_post:{post.id}"), ], ]) ) # post to online channel send_telegram_message( chat=CLUB_ONLINE, text=render_html_message("channel_post_announce.html", post=post), parse_mode=telegram.ParseMode.HTML, disable_preview=True, ) # only for newly created posts if post.is_visible and (is_created or "is_visible" in post.changed_fields): notified_user_ids = set() # parse @nicknames and notify mentioned users for username in USERNAME_RE.findall(post.text): user = User.objects.filter(slug=username).first() if user and user.telegram_id and user.id not in notified_user_ids: send_telegram_message( chat=Chat(id=user.telegram_id), text=render_html_message("post_mention.html", post=post), ) notified_user_ids.add(user.id) # notify friends about new posts friends = Friend.friends_for_user(post.author) for friend in friends: if friend.user_from.telegram_id \ and friend.is_subscribed_to_posts \ and friend.user_from.id not in notified_user_ids: send_telegram_message( chat=Chat(id=friend.user_from.telegram_id), text=render_html_message("friend_post.html", post=post), ) notified_user_ids.add(friend.user_from.id)
def async_create_or_update_comment(comment): notified_user_ids = set() # notify post subscribers post_subscribers = PostSubscription.post_subscribers(comment.post) for post_subscriber in post_subscribers: if post_subscriber.user.telegram_id and comment.author != post_subscriber.user: template = "comment_to_post.html" if post_subscriber.user == comment.post.author else "comment_to_post_announce.html" send_telegram_message( chat=Chat(id=post_subscriber.user.telegram_id), text=render_html_message(template, comment=comment), ) notified_user_ids.add(post_subscriber.user.id) # on reply — notify thread author (do not notify yourself) if comment.reply_to: thread_author = comment.reply_to.author if thread_author.telegram_id and comment.author != thread_author and thread_author.id not in notified_user_ids: send_telegram_message( chat=Chat(id=thread_author.telegram_id), text=render_html_message("comment_to_thread.html", comment=comment), ) notified_user_ids.add(thread_author.id) # post top level comments to online channel if not comment.reply_to: send_telegram_message( chat=CLUB_ONLINE, text=render_html_message("comment_to_post_announce.html", comment=comment), ) # parse @nicknames and notify their users for username in USERNAME_RE.findall(comment.text): if username == settings.MODERATOR_USERNAME: send_telegram_message( chat=ADMIN_CHAT, text=render_html_message("moderator_mention.html", comment=comment), ) continue user = User.objects.filter(slug=username).first() if user and user.telegram_id and user.id not in notified_user_ids: send_telegram_message( chat=Chat(id=user.telegram_id), text=render_html_message("comment_mention.html", comment=comment), ) notified_user_ids.add(user.id)
def async_create_or_update_comment(comment, is_created): # notify admins send_telegram_message( chat=ADMIN_CHAT, text=render_html_message("moderator_comment.html", comment=comment), ) # notify post author post_author = comment.post.author if post_author.telegram_id and comment.author != post_author: send_telegram_message( chat=Chat(id=comment.post.author.telegram_id), text=render_html_message("comment_to_post.html", comment=comment), ) # on reply — notify thread author (do not notify yourself) thread_author = None if comment.reply_to: thread_author = comment.reply_to.author if comment.reply_to_id and thread_author.telegram_id and comment.author != thread_author: send_telegram_message( chat=Chat(id=comment.reply_to.author.telegram_id), text=render_html_message("comment_to_thread.html", comment=comment), ) # post first level comments to club chat # if not comment.reply_to: # send_telegram_message( # chat=CLUB_CHAT, # text=render_html_message("comment_to_post_announce.html", comment=comment), # parse_mode=telegram.ParseMode.HTML, # ) # parse @nicknames and notify their users for username in USERNAME_RE.findall(comment.text): user = User.objects.filter(slug=username).first() if user and user.telegram_id and user != post_author and user != thread_author: send_telegram_message( chat=Chat(id=user.telegram_id), text=render_html_message("comment_mention.html", comment=comment), )
def async_create_or_update_post(post, is_created): if not post.is_approved_by_moderator: send_telegram_message( chat=ADMIN_CHAT, text=render_html_message("moderator_new_post_review.html", post=post), reply_markup=telegram.InlineKeyboardMarkup( [[ telegram.InlineKeyboardButton( "👍 Одобрить", callback_data=f"approve_post:{post.id}"), telegram.InlineKeyboardButton( "😕 Так себе", callback_data=f"forgive_post:{post.id}"), ], [ telegram.InlineKeyboardButton( "❌ В черновики", callback_data=f"delete_post:{post.id}"), ]])) # post to online channel send_telegram_message( chat=CLUB_ONLINE, text=render_html_message("channel_post_announce.html", post=post), parse_mode=telegram.ParseMode.HTML, disable_preview=True, ) # parse @nicknames and notify mentioned users (only if post is visible) if post.is_visible and (is_created or "is_visible" in post.changed_fields): notified_user_ids = set() for username in USERNAME_RE.findall(post.text): user = User.objects.filter(slug=username).first() if user and user.telegram_id and user.id not in notified_user_ids: send_telegram_message( chat=Chat(id=user.telegram_id), text=render_html_message("post_mention.html", post=post), ) notified_user_ids.add(user.id)
def async_create_or_update_comment(comment, is_created): # notify post author post_author = comment.post.author if post_author.telegram_id and comment.author != post_author: send_telegram_message( chat=Chat(id=comment.post.author.telegram_id), text=render_html_message("comment_to_post.html", comment=comment), ) # on reply — notify thread author (do not notify yourself) thread_author = None if comment.reply_to: thread_author = comment.reply_to.author if comment.reply_to_id and thread_author.telegram_id and comment.author != thread_author: send_telegram_message( chat=Chat(id=comment.reply_to.author.telegram_id), text=render_html_message("comment_to_thread.html", comment=comment), ) # post top level comments to online channel if not comment.reply_to: send_telegram_message( chat=CLUB_ONLINE, text=render_html_message("comment_to_post_announce.html", comment=comment), ) # parse @nicknames and notify their users for username in USERNAME_RE.findall(comment.text): user = User.objects.filter(slug=username).first() if user and user.telegram_id and user != post_author and user != thread_author: send_telegram_message( chat=Chat(id=user.telegram_id), text=render_html_message("comment_mention.html", comment=comment), )
def text(self, text): text = escape_html(text) text = USERNAME_RE.sub(r' <a href="/user/\1/">@\1</a>', text) return text
def async_create_or_update_comment(comment): notified_user_ids = set() # notify post subscribers post_subscribers = PostSubscription.post_subscribers(comment.post) for post_subscriber in post_subscribers: if post_subscriber.user.telegram_id and comment.author != post_subscriber.user: # respect subscription type (i.e. all comments vs top level only) if post_subscriber.type == PostSubscription.TYPE_ALL_COMMENTS \ or (post_subscriber.type == PostSubscription.TYPE_TOP_LEVEL_ONLY and not comment.reply_to_id): send_telegram_message( chat=Chat(id=post_subscriber.user.telegram_id), text=render_html_message("comment_to_post.html", comment=comment), ) notified_user_ids.add(post_subscriber.user.id) # notify thread author on reply (note: do not notify yourself) if comment.reply_to: thread_author = comment.reply_to.author if thread_author.telegram_id and comment.author != thread_author and thread_author.id not in notified_user_ids: send_telegram_message( chat=Chat(id=thread_author.telegram_id), text=render_html_message("comment_to_thread.html", comment=comment), ) notified_user_ids.add(thread_author.id) # post top level comments to online channel if not comment.reply_to and comment.post.is_visible and comment.post.is_visible_in_feeds: send_telegram_message( chat=CLUB_ONLINE, text=render_html_message("comment_to_post.html", comment=comment), ) # notify friends about your comments (not replies) if not comment.reply_to: friends = Friend.friends_for_user(comment.author) for friend in friends: if friend.user_from.telegram_id \ and friend.is_subscribed_to_comments \ and friend.user_from.id not in notified_user_ids: send_telegram_message( chat=Chat(id=friend.user_from.telegram_id), text=render_html_message("friend_comment.html", comment=comment), ) notified_user_ids.add(friend.user_from.id) # parse @nicknames and notify their users for username in USERNAME_RE.findall(comment.text): if username == settings.MODERATOR_USERNAME: send_telegram_message( chat=ADMIN_CHAT, text=render_html_message("moderator_mention.html", comment=comment), ) continue user = User.objects.filter(slug=username).first() if user and user.telegram_id and user.id not in notified_user_ids: send_telegram_message( chat=Chat(id=user.telegram_id), text=render_html_message("comment_mention.html", comment=comment), ) notified_user_ids.add(user.id)