def send_transaction_confirmation(self, bot, update):
        """Send transaction confirmation which has to be confirmed by both members"""
        query = update.callback_query
        member_validation_ids = [x["id"] for x in self.member_validation]
            
        if query.data == "OK" and query.from_user.id in member_validation_ids:
            member_ok = bu.get_member_by_id(query.from_user.id, members=self.budgetModel.members)
            self.member_validation.remove(member_ok)
            if self.member_validation:
                # One member still have to validate
                message = "Voici le résumé de la dette:"
                message += "\n<a href='tg://user?id={}'>{}</a> doit <b>{}€</b> à <a href='tg://user?id={}'>{}</a>, motif: <b>{}</b>.".format(self.recipient["id"], self.recipient["first_name"], self.amount, self.moneylender["id"], self.moneylender["first_name"], self.reason)
                message += "\nJ'attend encore une validation de la part de <b>{}</b>.".format(self.member_validation[0]["first_name"])
                keyboard = [[InlineKeyboardButton("Valider", callback_data='OK'),
                             InlineKeyboardButton("Refuser", callback_data='KO')]]
                reply_markup = InlineKeyboardMarkup(keyboard)
                bot.editMessageText(text=message,
                                    chat_id=query.message.chat_id,
                                    message_id=query.message.message_id,
                                    parse_mode="HTML",
                                    reply_markup=reply_markup,
                                    disable_notification=True)
            
            else:
                # Transaction has been validated by both members
                self.budgetModel.add_transaction(self.moneylender, self.recipient, self.amount, self.reason)
                message = "Dette ajoutée au registre !"
                message += "\n<a href='tg://user?id={}'>{}</a> doit <b>{}€</b> à <a href='tg://user?id={}'>{}</a> (<b>{}</b>).".format(self.recipient["id"], self.recipient["first_name"], self.amount, self.moneylender["id"], self.moneylender["first_name"], self.reason)
                bot.editMessageText(text=message,
                                    chat_id=query.message.chat_id,
                                    message_id=query.message.message_id,
                                    parse_mode="HTML",
                                    disable_notification=True)
                
                # Cleanup for next conversation
                self.reset_add_transaction_features()
                self.dispatcher.remove_handler(self.validate_transaction_handler)
                return ConversationHandler.END

        elif query.data == "KO" and query.from_user.id in member_validation_ids:
            # A member cancelled transaction
            message = "J'ai annulé la création de la dette:"
            message += "\n<a href='tg://user?id={}'>{}</a> doit <b>{}€</b> à <a href='tg://user?id={}'>{}</a> (<b>{}</b>).".format(self.recipient["id"], self.recipient["first_name"], self.amount, self.moneylender["id"], self.moneylender["first_name"], self.reason)
            message += "\n Refus de {}.".format(query.from_user.first_name)
            bot.editMessageText(text=message,
                                chat_id=query.message.chat_id,
                                message_id=query.message.message_id,
                                parse_mode="HTML",
                                disable_notification=True)
            
            # Cleanup for next conversation
            self.reset_add_transaction_features()
            self.dispatcher.remove_handler(self.validate_transaction_handler)
            return ConversationHandler.END
        
        # else: Unauthorized user press button, do nothing.
        return True
 def verify_arch_transactions(self, bot, update):
     """Verify debt between two members.
        Transactions can be archived only if the requester is the moneylender.
     """
     query = update.callback_query
     self.arch_member_requester = bu.get_member_by_id(query.from_user.id, members=self.budgetModel.members)
     self.arch_member_target = bu.get_member_by_id(int(query.data), members=self.budgetModel.members)
     self.global_transaction = self.budgetModel.get_debt_between_two_members(self.arch_member_requester, self.arch_member_target)
     
     message = "Es-tu certain de vouloir archiver les dettes courantes de <a href='tg://user?id={}'>{}</a> (<b>{}€</b>)?".format(self.global_transaction["global_recipient"]["id"], self.global_transaction["global_recipient"]["first_name"], self.global_transaction["global_amount"])
     keyboard = [[InlineKeyboardButton("Oui", callback_data='OK'),
                  InlineKeyboardButton("Annuler", callback_data='KO')]]
     reply_markup = InlineKeyboardMarkup(keyboard)
     bot.editMessageText(text=message,
                         chat_id=query.message.chat_id,
                         message_id=query.message.message_id,
                         reply_markup=reply_markup,
                         parse_mode="HTML",
                         disable_notification=True)
     
     return self.archivingConvStates(2).name
 def send_user_debts(self, bot, update):
     """Send resume of debts implying requesting user"""
     member = bu.get_member_by_id(update.message.from_user.id, members=self.budgetModel.members)
     debts = self.budgetModel.get_total_debts(member)
     if debts:
         message = "Résumé des dettes te concernant:"
         for debt in debts:
             message += "\n<a href='tg://user?id={}'>{}</a> doit un total de {}€ à <a href='tg://user?id={}'>{}</a>.".format(debt["global_recipient"]["id"], debt["global_recipient"]["first_name"], debt["global_amount"], debt["global_moneylender"]["id"], debt["global_moneylender"]["first_name"])
     else:
         message = "Tu n'as aucune dette pour le moment petit veinard."
     
     update.message.reply_text(message, parse_mode="HTML")
     return True
    def send_scores(self, bot, update):
        """Send game ranking for each players"""
        scores = gm.get_scores()
        members = bu.load_members()
        message = ""
        for i, score in enumerate(reversed(scores)):
            if i == 0:
                message += "\U0001F947"  # First place medal
            elif i == 1:
                message += "\U0001F948"  # Second place medal
            elif i == 2:
                message += "\U0001F949"  # Third place medal
            first_name = bu.get_member_by_id(score["id"], members=members)["first_name"]
            message += "<a href='tg://user?id={}'>{}</a> - {} victoires\n".format(score["id"], first_name, score["won"])

        bot.sendMessage(chat_id=config.chat_id, text=message, parse_mode="HTML", disable_notification=True)
 def select_transaction_amount(self, bot, update):
     """Get the recipient id and ask for amount"""
     query = update.callback_query
     print(query.data)
     self.recipient = bu.get_member_by_id(int(query.data), members=self.budgetModel.members)
     self.member_validation = [self.moneylender, self.recipient]
     print(self.member_validation)
     
     message = "Combien te doit <a href='tg://user?id={}'>{}</a> et pour quel motif ? (Envoie moi le montant, suivi ou non d'un motif)".format(self.recipient["id"], self.recipient["first_name"])
     print(message)
     bot.editMessageText(text=message,
                         chat_id=query.message.chat_id,
                         message_id=query.message.message_id,
                         parse_mode="HTML",
                         disable_notification=True)
                         
     return self.transactionConvStates(2).name
    def start_transaction_conv(self, bot, update):
        """Start point of the conversation to add a transaction"""
        # Remove entry point to avoid concurrent conversations
        self.dispatcher.remove_handler(self.transaction_conv_entry)
        self.moneylender = bu.get_member_by_id(update.message.from_user.id, members=self.budgetModel.members)
        keyboard = []
        for member in self.budgetModel.update_members():
            if not member == self.moneylender:
                button = InlineKeyboardButton(member["first_name"], callback_data=str(member["id"]))
                keyboard.append([button])

        reply_markup = InlineKeyboardMarkup(keyboard)
        message = "Quel membre du groupe te doit de l'argent ?"
        update.message.reply_text(text=message,
                                  parse_mode="HTML",
                                  reply_markup=reply_markup,
                                  disable_notification=True)
        
        print(self.transactionConvStates(1).name)
        return self.transactionConvStates(1).name
 def start_arch_transactions(self, bot, update):
     """Start point of the conversation to archive all ongoing transactions between two players"""
     # Remove entry point to avoid concurrent conversations
     self.dispatcher.remove_handler(self.archiving_conv_entry)
     member_requester = bu.get_member_by_id(update.message.from_user.id, members=self.budgetModel.members)
     total_debts = self.budgetModel.get_total_debts(member_requester)
     keyboard = []
     for debt in total_debts:
         if debt["global_moneylender"]["id"] == update.message.from_user.id:
             button = InlineKeyboardButton(debt["global_recipient"]["first_name"], callback_data=str(debt["global_recipient"]["id"]))
             keyboard.append([button])
     
     if keyboard:
         reply_markup = InlineKeyboardMarkup(keyboard)
         message = "Avec quelle personne souhaites-tu archiver les dettes courantes ?"
         update.message.reply_text(message, parse_mode="HTML", reply_markup=reply_markup)
         return self.archivingConvStates(1).name
     
     else:
         message = "Personne ne te doit d'argent, tu ne peux donc pas archiver de dettes."
         update.message.reply_text(message, parse_mode="HTML")
         return ConversationHandler.END