def process_comment_reply(update: Update): if not update.message.reply_to_message: return user = get_bot_user(update) if not user: return comment_url_entity = [ entity["url"] for entity in update.message.reply_to_message.entities if entity["type"] == "text_link" and COMMENT_URL_RE.match(entity["url"]) ] if not comment_url_entity: log.info( f"Comment url not found in: {update.message.reply_to_message.entities}" ) return comment_id = COMMENT_URL_RE.match(comment_url_entity[0]).group(1) comment = Comment.objects.filter(id=comment_id).first() if not comment: log.info(f"Comment not found: {comment_id}") return is_ok = Comment.check_rate_limits(user) if not is_ok: send_telegram_message( chat=Chat(id=update.effective_chat.id), text= f"🙅♂️ Извините, вы комментировали слишком часто и достигли дневного лимита" ) return text = update.message.text or update.message.caption if not text: send_telegram_message( chat=Chat(id=update.effective_chat.id), text=f"😣 Сорян, я пока умею только в текстовые ответы") return # max 3 levels of comments are allowed reply_to_id = comment.id if comment.reply_to_id and comment.reply_to.reply_to_id: reply_to_id = comment.reply_to_id reply = Comment.objects.create(author=user, post=comment.post, reply_to_id=reply_to_id, text=f"@{comment.author.slug}, {text}", useragent="TelegramBot (like TwitterBot)", metadata={"telegram": update.to_dict()}) new_comment_url = settings.APP_HOST + reverse("show_comment", kwargs={ "post_slug": reply.post.slug, "comment_id": reply.id }) send_telegram_message( chat=Chat(id=update.effective_chat.id), text=f"➜ <a href=\"{new_comment_url}\">Отвечено</a> 👍")
def create_comment(request, post_slug): post = get_object_or_404(Post, slug=post_slug) if not post.is_commentable and not request.me.is_moderator: raise AccessDenied(title="Комментарии к этому посту закрыты") if request.POST.get("reply_to_id"): ProperCommentForm = ReplyForm elif post.type == Post.TYPE_BATTLE: ProperCommentForm = BattleCommentForm else: ProperCommentForm = CommentForm if request.method == "POST": form = ProperCommentForm(request.POST) if form.is_valid(): is_ok = Comment.check_rate_limits(request.me) if not is_ok: raise RateLimitException( title="🙅♂️ Вы комментируете слишком часто", message= "Подождите немного, вы достигли нашего лимита на комментарии в день. " "Можете написать нам в саппорт, пожаловаться об этом.") comment = form.save(commit=False) comment.post = post if not comment.author: comment.author = request.me comment.ipaddress = parse_ip_address(request) comment.useragent = parse_useragent(request) comment.save() # update the shitload of counters :) request.me.update_last_activity() Comment.update_post_counters(post) PostView.increment_unread_comments(comment) PostView.register_view( request=request, user=request.me, post=post, ) SearchIndex.update_comment_index(comment) LinkedPost.create_links_from_text(post, comment.text) return redirect("show_comment", post.slug, comment.id) else: log.error(f"Comment form error: {form.errors}") return render( request, "error.html", { "title": "Какая-то ошибка при публикации комментария 🤷♂️", "message": f"Мы уже получили оповещение и скоро пофиксим. " f"Ваш коммент мы сохранили чтобы вы могли скопировать его и запостить еще раз:", "data": form.cleaned_data.get("text") }) raise Http404()
def process_comment_reply(update: Update): if not update.message.reply_to_message: return user = User.objects.filter(telegram_id=update.effective_user.id).first() if not user: send_telegram_message( chat=Chat(id=update.effective_user.id), text=f"😐 Извините, мы не знакомы. Привяжите свой аккаунт в профиле на https://vas3k.club" ) return comment_url_entity = [ entity["url"] for entity in update.message.reply_to_message.entities if entity["type"] == "text_link" and COMMENT_URL_RE.match(entity["url"]) ] if not comment_url_entity: log.info(f"Comment url not found in: {update.message.reply_to_message.entities}") return reply_to_id = COMMENT_URL_RE.match(comment_url_entity[0]).group(1) reply = Comment.objects.filter(id=reply_to_id).first() if not reply: log.info(f"Reply not found: {reply_to_id}") return is_ok = Comment.check_rate_limits(user) if not is_ok: send_telegram_message( chat=Chat(id=update.effective_chat.id), text=f"🙅♂️ Извините, вы комментировали слишком часто и достигли дневного лимита" ) return comment = Comment.objects.create( author=user, post=reply.post, reply_to=Comment.find_top_comment(reply), text=update.message.text, useragent="TelegramBot (like TwitterBot)", metadata={ "telegram": update.to_dict() } ) new_comment_url = settings.APP_HOST + reverse("show_comment", kwargs={ "post_slug": comment.post.slug, "comment_id": comment.id }) send_telegram_message( chat=Chat(id=update.effective_chat.id), text=f"➜ [Отвечено]({new_comment_url}) 👍" )
def comment_to_post(update: Update, context: CallbackContext) -> None: user = get_club_user(update) if not user: return None post = get_club_post(update) if not post or post.type in [Post.TYPE_BATTLE, Post.TYPE_WEEKLY_DIGEST]: return None is_ok = Comment.check_rate_limits(user) if not is_ok: update.message.reply_text( f"🙅♂️ Извините, вы комментировали слишком часто и достигли дневного лимита" ) return None text = update.message.text or update.message.caption if not text: update.message.reply_text( f"😣 Сорян, я пока умею только в текстовые реплаи" ) return None if len(text) < MIN_COMMENT_LEN: update.message.reply_text( f"😋 Твой коммент слишком короткий. Не буду постить его в Клуб, пускай остается в чате" ) return None reply = Comment.objects.create( author=user, post=post, text=text, useragent="TelegramBot (like TwitterBot)", metadata={ "telegram": update.to_dict() } ) LinkedPost.create_links_from_text(post, text) new_comment_url = settings.APP_HOST + reverse("show_comment", kwargs={ "post_slug": reply.post.slug, "comment_id": reply.id }) update.message.reply_text( f"➜ <a href=\"{new_comment_url}\">Отвечено</a> 👍", parse_mode=ParseMode.HTML, disable_web_page_preview=True )
def reply_to_comment(update: Update, context: CallbackContext) -> None: user = get_club_user(update) if not user: return None comment = get_club_comment(update) if not comment: return None is_ok = Comment.check_rate_limits(user) if not is_ok: update.message.reply_text( f"🙅♂️ Извините, вы комментировали слишком часто и достигли дневного лимита" ) return None text = update.message.text or update.message.caption if not text: update.message.reply_text( f"😣 Сорян, я пока умею только в текстовые реплаи" ) return None # max 3 levels of comments are allowed reply_to_id = comment.id if comment.reply_to_id and comment.reply_to.reply_to_id: reply_to_id = comment.reply_to_id reply = Comment.objects.create( author=user, post=comment.post, reply_to_id=reply_to_id, text=f"@{comment.author.slug}, {text}", useragent="TelegramBot (like TwitterBot)", metadata={ "telegram": update.to_dict() } ) new_comment_url = settings.APP_HOST + reverse("show_comment", kwargs={ "post_slug": reply.post.slug, "comment_id": reply.id }) update.message.reply_text( f"➜ <a href=\"{new_comment_url}\">Отвечено</a> 👍", parse_mode=ParseMode.HTML, disable_web_page_preview=True )