def poll_status(bot: DeltaBot, args: str, message: Message, replies: Replies) -> None: """Get poll status.""" addr = message.get_sender_contact().addr if args: try: with session_scope() as session: poll = session.query(Poll).filter_by(id=int(args[0])).one() is_admin = addr == poll.addr voted = is_admin or addr in [v.addr for v in poll.votes] if voted: text, html = _format_poll(bot, poll, voted=True, is_admin=is_admin) else: text = "❌ You can't see poll status until you vote" html = None replies.add(text=text, html=html, chat=message.get_sender_chat()) except NoResultFound: replies.add(text="❌ Invalid poll", quote=message, chat=message.get_sender_chat()) else: replies.add(text="❌ Invalid poll", quote=message, chat=message.get_sender_chat())
def vote(bot: DeltaBot, args: str, message: Message, replies: Replies) -> None: """Vote in polls.""" if len(args) == 2: option_id = int(args[1]) addr = message.get_sender_contact().addr try: with session_scope() as session: poll = session.query(Poll).filter_by(id=int(args[0])).one() if addr in [v.addr for v in poll.votes]: text, html = "❌ You already voted", None elif option_id not in [o.id for o in poll.options]: text, html = "❌ Invalid option number", None else: poll.votes.append(Vote(addr=addr, value=option_id)) is_admin = addr == poll.addr text, html = _format_poll(bot, poll, voted=True, is_admin=is_admin) replies.add(text=text, html=html, chat=message.get_sender_chat()) except NoResultFound: replies.add(text="❌ Invalid poll", quote=message, chat=message.get_sender_chat()) else: replies.add(text="❌ Invalid poll", quote=message, chat=message.get_sender_chat())
def poll_end(bot: DeltaBot, args: str, message: Message, replies: Replies) -> None: """Close the poll with the given id.""" if args: addr = message.get_sender_contact().addr try: with session_scope() as session: poll = session.query(Poll).filter_by(id=int(args[0]), addr=addr).one() text, html = _format_poll(bot, poll, closed=True) addresses = set(vote.addr for vote in poll.votes) session.delete(poll) addresses.add(addr) for addr in addresses: contact = bot.get_contact(addr) if not contact.is_blocked(): replies.add(text=text, html=html, chat=bot.get_chat(contact)) except NoResultFound: replies.add(text="❌ Invalid poll", quote=message, chat=message.get_sender_chat()) else: replies.add(text="❌ Invalid poll", quote=message, chat=message.get_sender_chat())
def poll_settings(args: str, message: Message, replies: Replies) -> None: """Get poll's advanced settings.""" if args: try: with session_scope() as session: poll = (session.query(Poll).filter_by( id=int(args[0]), addr=message.get_sender_contact().addr).one()) text = "📊 /poll_get_{0}\n{1}\n\n🛑 /poll_end_{0}".format( poll.id, poll.question) replies.add(text=text, chat=message.get_sender_chat()) except NoResultFound: replies.add(text="❌ Invalid poll", quote=message, chat=message.get_sender_chat()) else: replies.add(text="❌ Invalid poll", quote=message, chat=message.get_sender_chat())
def poll_list(message: Message, replies: Replies) -> None: """Show your public polls.""" with session_scope() as session: text = "" for poll in (session.query(Poll).filter_by( addr=message.get_sender_contact().addr).all()): if len(poll.question) > 100: q = poll.question[:100] + "..." else: q = poll.question text += "📊 /poll_get_{} {}\n\n".format(poll.id, q) replies.add(text=text or "❌ Empty list", chat=message.get_sender_chat())