From 78a8a3cf83beb85d5dd44711040fc9b557403e0a Mon Sep 17 00:00:00 2001 From: baleadmin Date: Thu, 27 Dec 2018 15:34:25 +0330 Subject: [PATCH 01/11] fix: handle_monitoring_msg in dispatcher.py --- balebot/config.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/balebot/config.py b/balebot/config.py index 1c5935f..ba0e5c4 100644 --- a/balebot/config.py +++ b/balebot/config.py @@ -3,7 +3,7 @@ class Config: - receive_timeout = int(os.environ.get("SESSION_TIMEOUT",60)) + receive_timeout = int(os.environ.get("SESSION_TIMEOUT", 60)) base_url = os.environ.get('BASE_URL', "wss://api.bale.ai/v1/bots/") request_timeout = int(os.environ.get('REQUEST_TIMEOUT', 5)) # 0:print to output 1:use graylog 2:both 0 and 1 @@ -13,7 +13,7 @@ class Config: graylog_port = int(os.environ.get('SDK_GRAYLOG_PORT', 12201)) log_level = int(os.environ.get('SDK_LOG_LEVEL', logging.DEBUG)) log_facility_name = os.environ.get('SDK_LOG_FACILITY_NAME', "python_bale_bot") - monitoring_hash = os.environ.get('MONITORING_HASH', "SADJSDSDas4d2asf41f2a2faasd45sas-") + monitoring_hash = os.environ.get('MONITORING_HASH', "kjs3cns6uuw7b8cgx14d2asf41f2a2fd45sp-") real_time_fetch_updates = os.environ.get('REAL_TIME_FETCH_UPDATES', True) continue_last_processed_seq = os.environ.get('CONTINUE_LAST_PROCESSED_SEQ', False) timeInterval = int(os.environ.get('TIME_INTERVAL', 1)) # unit for time interval is second) From 94fb168921b26fb6e27105949b52f892ea884ebe Mon Sep 17 00:00:00 2001 From: baleadmin Date: Thu, 27 Dec 2018 16:31:55 +0330 Subject: [PATCH 02/11] ref: refactor simple_echo.py and rename it to echobot.py --- Config.py | 2 +- examples/bank_receipt_conversation.py | 2 +- examples/contact_conversation.py | 2 +- examples/document_conversation.py | 2 +- examples/echobot.py | 45 +++++++++++++++++++++++ examples/location_conversation.py | 2 +- examples/photo_voice_conversation.py | 2 +- examples/purchase_conversation.py | 2 +- examples/simple_echo.py | 35 ------------------ examples/simple_edit_message.py | 2 +- examples/template_message_conversation.py | 2 +- examples/text_conversation.py | 2 +- 12 files changed, 55 insertions(+), 45 deletions(-) create mode 100644 examples/echobot.py delete mode 100644 examples/simple_echo.py diff --git a/Config.py b/Config.py index f5aec79..126e95a 100644 --- a/Config.py +++ b/Config.py @@ -12,4 +12,4 @@ class Config: log_level = int(os.environ.get('SDK_LOG_LEVEL', logging.DEBUG)) log_facility_name = os.environ.get('SDK_LOG_FACILITY_NAME', "python_bale_bot") source = os.environ.get('LOG_SOURCE', "bot_source") - heartbeat = int(os.environ.get("HEARTBEAT",30)) + heartbeat = int(os.environ.get("HEARTBEAT", 30)) diff --git a/examples/bank_receipt_conversation.py b/examples/bank_receipt_conversation.py index 10dc9ff..3150cc0 100644 --- a/examples/bank_receipt_conversation.py +++ b/examples/bank_receipt_conversation.py @@ -10,7 +10,7 @@ from balebot.updater import Updater # Bale Bot Authorization Token -updater = Updater(token="PUT YOUR TOKEN HERE", +updater = Updater(token="TOKEN", loop=asyncio.get_event_loop()) dispatcher = updater.dispatcher diff --git a/examples/contact_conversation.py b/examples/contact_conversation.py index 5fae36d..752da27 100644 --- a/examples/contact_conversation.py +++ b/examples/contact_conversation.py @@ -9,7 +9,7 @@ from balebot.updater import Updater # Bale Bot Authorization Token -updater = Updater(token="PUT YOUR TOKEN HERE", +updater = Updater(token="TOKEN", loop=asyncio.get_event_loop()) dispatcher = updater.dispatcher diff --git a/examples/document_conversation.py b/examples/document_conversation.py index b197af5..599061f 100644 --- a/examples/document_conversation.py +++ b/examples/document_conversation.py @@ -9,7 +9,7 @@ import datetime # Bale Bot Authorization Token -updater = Updater(token="PUT YOUR TOKEN HERE", +updater = Updater(token="TOKEN", loop=asyncio.get_event_loop()) dispatcher = updater.dispatcher diff --git a/examples/echobot.py b/examples/echobot.py new file mode 100644 index 0000000..9c08fb8 --- /dev/null +++ b/examples/echobot.py @@ -0,0 +1,45 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- + +"""Simple Bot to Reply to Bale messages.""" + +import asyncio + +from balebot.filters import DefaultFilter +from balebot.handlers import CommandHandler, MessageHandler +from balebot.updater import Updater + + +def start(bot, update): + bot.reply(update, 'Hi!') + + +def help(bot, update): + bot.reply(update, 'Help!') + + +def echo(bot, update): + message = update.get_effective_message() + bot.reply(update, message) + + +def main(): + # Bale Bot Authorization Token + updater = Updater("TOKEN", loop=asyncio.get_event_loop()) + + # Define dispatcher + dp = updater.dispatcher + + # Add Command Handlers + dp.add_handler(CommandHandler("start", start)) + dp.add_handler(CommandHandler("help", help)) + + # Add Message Handlers + dp.add_handler(MessageHandler(DefaultFilter(), echo)) + + # Run the bot! + updater.run() + + +if __name__ == '__main__': + main() diff --git a/examples/location_conversation.py b/examples/location_conversation.py index 8b9414b..f72eeb9 100644 --- a/examples/location_conversation.py +++ b/examples/location_conversation.py @@ -10,7 +10,7 @@ import datetime # Bale Bot Authorization Token -updater = Updater(token="PUT YOUR TOKEN HERE", +updater = Updater(token="TOKEN", loop=asyncio.get_event_loop()) dispatcher = updater.dispatcher diff --git a/examples/photo_voice_conversation.py b/examples/photo_voice_conversation.py index c7f0955..ab8bf06 100644 --- a/examples/photo_voice_conversation.py +++ b/examples/photo_voice_conversation.py @@ -9,7 +9,7 @@ from balebot.utils.logger import Logger # Bale Bot Authorization Token -updater = Updater(token="PUT YOUR TOKEN HERE", +updater = Updater(token="TOKEN", loop=asyncio.get_event_loop()) dispatcher = updater.dispatcher my_logger = Logger.get_logger() # Create a logger and name it my_logger diff --git a/examples/purchase_conversation.py b/examples/purchase_conversation.py index 0cdf1e2..528df56 100644 --- a/examples/purchase_conversation.py +++ b/examples/purchase_conversation.py @@ -9,7 +9,7 @@ from balebot.utils.logger import Logger # Bale Bot Authorization Token -updater = Updater(token="PUT YOUR TOKEN HERE", +updater = Updater(token="TOKEN", loop=asyncio.get_event_loop()) dispatcher = updater.dispatcher my_logger = Logger.get_logger() # Create a logger and name it my_logger diff --git a/examples/simple_echo.py b/examples/simple_echo.py deleted file mode 100644 index 7bce6a4..0000000 --- a/examples/simple_echo.py +++ /dev/null @@ -1,35 +0,0 @@ -"""Simple Bot to Reply to Bale messages.""" - -import asyncio - -from balebot.filters import DefaultFilter -from balebot.models.messages import TextMessage -from balebot.updater import Updater - -# Bale Bot Authorization Token -updater = Updater(token="PUT YOUR TOKEN HERE", - loop=asyncio.get_event_loop()) -# Define dispatcher -dispatcher = updater.dispatcher - - -# Both of success and failure functions are optional -def success(response, user_data): - print("success : ", response) - print(user_data) - - -def failure(response, user_data): - print("failure : ", response) - print(user_data) - - -@dispatcher.message_handler(filters=DefaultFilter()) -def echo(bot, update): - message = TextMessage('*Hello*') - # Send a message to client - bot.reply(update, message, success_callback=success, failure_callback=failure) - - -# Run the bot! -updater.run() diff --git a/examples/simple_edit_message.py b/examples/simple_edit_message.py index 690ac3b..66df544 100644 --- a/examples/simple_edit_message.py +++ b/examples/simple_edit_message.py @@ -9,7 +9,7 @@ # Bale Bot Authorization Token -updater = Updater(token="PUT YOUR TOKEN HERE", +updater = Updater(token="TOKEN", loop=asyncio.get_event_loop()) # Define dispatcher dispatcher = updater.dispatcher diff --git a/examples/template_message_conversation.py b/examples/template_message_conversation.py index a0f1671..6cede4f 100644 --- a/examples/template_message_conversation.py +++ b/examples/template_message_conversation.py @@ -8,7 +8,7 @@ from balebot.utils.logger import Logger # Bale Bot Authorization Token -updater = Updater(token="PUT YOUR TOKEN HERE", +updater = Updater(token="TOKEN", loop=asyncio.get_event_loop()) dispatcher = updater.dispatcher my_logger = Logger.get_logger() # Create a logger and name it my_logger diff --git a/examples/text_conversation.py b/examples/text_conversation.py index d1d44e1..14a945c 100644 --- a/examples/text_conversation.py +++ b/examples/text_conversation.py @@ -8,7 +8,7 @@ from balebot.utils.logger import Logger # Bale Bot Authorization Token -updater = Updater(token="PUT YOUR TOKEN HERE", +updater = Updater(token="TOKEN", loop=asyncio.get_event_loop()) dispatcher = updater.dispatcher my_logger = Logger.get_logger() # Create a logger and name it my_logger From 1e02c782fb589fa0c945cea8f6c6b03fcddbe2d3 Mon Sep 17 00:00:00 2001 From: baleadmin Date: Thu, 27 Dec 2018 16:36:27 +0330 Subject: [PATCH 03/11] ref: Add base_url to Updater class and set default for it. --- balebot/bot.py | 6 ++++-- balebot/connection/network.py | 20 +++++++++++++------- balebot/dispatcher.py | 4 ++-- balebot/updater.py | 6 +++--- examples/echobot.py | 2 +- 5 files changed, 23 insertions(+), 15 deletions(-) diff --git a/balebot/bot.py b/balebot/bot.py index 5377e9a..482adbb 100644 --- a/balebot/bot.py +++ b/balebot/bot.py @@ -20,9 +20,9 @@ class Bot: - def __init__(self, loop, token, incoming_queue, outgoing_queue, bale_futures, timeout): + def __init__(self, loop, token, base_url, incoming_queue, outgoing_queue, bale_futures, timeout): self._loop = loop - self.network = Network(token=token, + self.network = Network(token=token, base_url=base_url, incoming_queue=incoming_queue, outgoing_queue=outgoing_queue, loop=loop) @@ -177,6 +177,7 @@ async def get_data(download_url): future.reject(response=None) except Exception as e: future.reject(response=None) + url = result.body.url asyncio.ensure_future(get_data(url)) @@ -221,6 +222,7 @@ async def upload_data(): future.reject(response=None) except Exception as e: future.reject(response=None) + asyncio.ensure_future(upload_data()) def file_upload_url_failure(result, user_data): diff --git a/balebot/connection/network.py b/balebot/connection/network.py index 405e09a..3fd07b6 100644 --- a/balebot/connection/network.py +++ b/balebot/connection/network.py @@ -10,10 +10,10 @@ class Network: """ network layer main class """ - def __init__(self, token, incoming_queue=None, outgoing_queue=None, loop=None): + def __init__(self, token, base_url, incoming_queue=None, outgoing_queue=None, loop=None): self.logger = Logger.get_logger() - self._base_url = Config.base_url + self._base_url = base_url self._token = token self._running = False self._incoming_queue = incoming_queue or asyncio.Queue() @@ -33,24 +33,30 @@ async def connect(self): try: self._session = aiohttp.ClientSession(loop=self._loop) - self._ws = await self._session.ws_connect(self.construct_url(),heartbeat=self._heartbeat,receive_timeout=self._receive_timeout,headers={"source":"python3.5"}) + self._ws = await self._session.ws_connect(self.construct_url(), heartbeat=self._heartbeat, + receive_timeout=self._receive_timeout, + headers={"source": "python3.5"}) self.logger.warning('connect success: {}'.format(self.construct_url())) except Exception as e: await self.disconnect() self.logger.error('connect error: {}'.format(e), - extra={"tag": "err","type": "connection", "url": self.construct_url(), "error_type": type(e)}) + extra={"tag": "err", "type": "connection", "url": self.construct_url(), + "error_type": type(e)}) traceback.print_exc() elif self._ws.closed: try: if self._session.closed: self._session = aiohttp.ClientSession(loop=self._loop) - self._ws = await self._session.ws_connect(self.construct_url(),heartbeat=self._heartbeat,receive_timeout=self._receive_timeout,headers={"source":"python3.5"}) + self._ws = await self._session.ws_connect(self.construct_url(), heartbeat=self._heartbeat, + receive_timeout=self._receive_timeout, + headers={"source": "python3.5"}) self.logger.warning('reconnect success: {}'.format(self.construct_url())) except Exception as e: await self.disconnect() self.logger.error('reconnect error: {}'.format(e), - extra={"tag": "err", "type": "connection", "url": self.construct_url(), "error_type": type(e)}) + extra={"tag": "err", "type": "connection", "url": self.construct_url(), + "error_type": type(e)}) traceback.print_exc() return self._ws @@ -127,4 +133,4 @@ def connected(self): return True def send(self, item): - self._outgoing_queue.put_nowait(item) \ No newline at end of file + self._outgoing_queue.put_nowait(item) diff --git a/balebot/dispatcher.py b/balebot/dispatcher.py index e2df389..57450c2 100644 --- a/balebot/dispatcher.py +++ b/balebot/dispatcher.py @@ -16,7 +16,7 @@ class Dispatcher: - def __init__(self, loop, token, bale_futures): + def __init__(self, loop, token, base_url, bale_futures): self.logger = Logger.get_logger() self.incoming_queue = asyncio.Queue() @@ -24,7 +24,7 @@ def __init__(self, loop, token, bale_futures): self.timeout = Config.request_timeout self.token = token self.bot = Bot(loop=loop, - token=token, + token=token, base_url=base_url, incoming_queue=self.incoming_queue, outgoing_queue=self.outgoing_queue, bale_futures=bale_futures, diff --git a/balebot/updater.py b/balebot/updater.py index 8725c9a..9e03910 100644 --- a/balebot/updater.py +++ b/balebot/updater.py @@ -15,7 +15,7 @@ class Updater: - def __init__(self, token, loop=None): + def __init__(self, token, base_url=Config.base_url, loop=None): self.logger = Logger.get_logger() @@ -30,7 +30,7 @@ def __init__(self, token, loop=None): self._loop = asyncio.get_event_loop() if not loop else loop self.dispatcher = Dispatcher(loop=self._loop, - token=self.token, + token=self.token, base_url=base_url, bale_futures=self.bale_futures) self.running = False @@ -41,7 +41,7 @@ def run(self, stop_after=None): bot_previous_state = pickle.loads(bot_previous_state) if bot_previous_state else None self.dispatcher.conversation_next_step_handlers, self.dispatcher.conversation_data = \ (bot_previous_state.conversation_next_step_handlers, bot_previous_state.conversation_data) \ - if bot_previous_state else ({}, {}) + if bot_previous_state else ({}, {}) asyncio.ensure_future(self._run_dispatcher()) asyncio.ensure_future(self.dispatcher.bot.network.run()) diff --git a/examples/echobot.py b/examples/echobot.py index 9c08fb8..8da4171 100644 --- a/examples/echobot.py +++ b/examples/echobot.py @@ -25,7 +25,7 @@ def echo(bot, update): def main(): # Bale Bot Authorization Token - updater = Updater("TOKEN", loop=asyncio.get_event_loop()) + updater = Updater("TOKEN") # Define dispatcher dp = updater.dispatcher From 1b3be6dd0aa67348c5c966ff4ca77948ec96a682 Mon Sep 17 00:00:00 2001 From: baleadmin Date: Thu, 27 Dec 2018 17:03:29 +0330 Subject: [PATCH 04/11] ref: Add text attribute in TemplateResponseMessage class for similarity with TextMessage. --- balebot/handlers/command_handler.py | 2 +- balebot/models/messages/template_response_message.py | 6 +++--- balebot/models/messages/text_message.py | 1 - balebot/updater.py | 3 +++ examples/echobot.py | 2 -- 5 files changed, 7 insertions(+), 7 deletions(-) diff --git a/balebot/handlers/command_handler.py b/balebot/handlers/command_handler.py index 118d5e5..455a495 100644 --- a/balebot/handlers/command_handler.py +++ b/balebot/handlers/command_handler.py @@ -20,7 +20,7 @@ def check_update(self, update): if isinstance(message, TextMessage): message_text = message.text.lower() elif self.include_template_response and isinstance(message, TemplateResponseMessage): - message_text = message.text_message.lower() + message_text = message.text.lower() else: return False diff --git a/balebot/models/messages/template_response_message.py b/balebot/models/messages/template_response_message.py index 6b34bb4..24c88ce 100644 --- a/balebot/models/messages/template_response_message.py +++ b/balebot/models/messages/template_response_message.py @@ -32,10 +32,10 @@ def load_from_json(cls, json): else: raise ValueError(Error.unacceptable_json) - text_message = json_dict.get("textMessage", None) + text = json_dict.get("textMessage", None) template_message_response_id = json_dict.get("templateMessageResponseId", None) - if (text_message is None) or (template_message_response_id is None): + if (text is None) or (template_message_response_id is None): raise ValueError(Error.none_or_invalid_attribute) - return cls(text=text_message, template_message_response_id=template_message_response_id) + return cls(text=text, template_message_response_id=template_message_response_id) diff --git a/balebot/models/messages/text_message.py b/balebot/models/messages/text_message.py index df0862d..b2d25f8 100644 --- a/balebot/models/messages/text_message.py +++ b/balebot/models/messages/text_message.py @@ -8,7 +8,6 @@ class TextMessage(BaseMessage): def __init__(self, text): - self.text = str(text) if text else "" def get_json_object(self): diff --git a/balebot/updater.py b/balebot/updater.py index 9e03910..23120df 100644 --- a/balebot/updater.py +++ b/balebot/updater.py @@ -22,6 +22,9 @@ def __init__(self, token, base_url=Config.base_url, loop=None): if not token: raise ValueError("`token` did't passed") + if not base_url: + raise ValueError("`base_url` did't passed") + self.token = token self.timeout = Config.request_timeout diff --git a/examples/echobot.py b/examples/echobot.py index 8da4171..3047992 100644 --- a/examples/echobot.py +++ b/examples/echobot.py @@ -3,8 +3,6 @@ """Simple Bot to Reply to Bale messages.""" -import asyncio - from balebot.filters import DefaultFilter from balebot.handlers import CommandHandler, MessageHandler from balebot.updater import Updater From e01819ad122aa768cdb9b07fc598d4b7a6f3ff64 Mon Sep 17 00:00:00 2001 From: baleadmin Date: Thu, 14 Feb 2019 11:54:09 +0330 Subject: [PATCH 05/11] ref: ADD error handler, logger and more comments to echobot.py --- examples/echobot.py | 39 ++++++++++++++++++++++++++++++++++----- 1 file changed, 34 insertions(+), 5 deletions(-) diff --git a/examples/echobot.py b/examples/echobot.py index 3047992..6ba8469 100644 --- a/examples/echobot.py +++ b/examples/echobot.py @@ -1,41 +1,70 @@ #!/usr/bin/env python # -*- coding: utf-8 -*- -"""Simple Bot to Reply to Bale messages.""" +"""Simple Bot to reply to Bale messages. + +This Bot uses the Updater class to handle the bot. + +First, a few handler functions are defined. Then, those functions are passed to +the Dispatcher and registered at their respective places. +Then, the bot is started and runs until we press Ctrl-C on the command line. + +Usage: +Basic Echobot example, repeats messages. +Press Ctrl-C on the command line or send a signal to the process to stop the +bot. +""" from balebot.filters import DefaultFilter from balebot.handlers import CommandHandler, MessageHandler from balebot.updater import Updater +from balebot.utils.logger import Logger + +# Enable logging +logger = Logger.get_logger() +# Define a few command handlers. These usually take the two arguments bot and def start(bot, update): + """Send a message when the command /start is issued.""" bot.reply(update, 'Hi!') def help(bot, update): + """Send a message when the command /help is issued.""" bot.reply(update, 'Help!') def echo(bot, update): + """Echo the user message.""" message = update.get_effective_message() bot.reply(update, message) +def error(bot, update, error): + """Log Errors caused by Updates.""" + logger.error('Update {} caused error {}'.format(update, error), extra={"tag": "err"}) + + def main(): + """Start the bot.""" # Bale Bot Authorization Token updater = Updater("TOKEN") - # Define dispatcher + # Get the dispatcher to register handlers dp = updater.dispatcher - # Add Command Handlers + # on different commands - answer in Bale dp.add_handler(CommandHandler("start", start)) dp.add_handler(CommandHandler("help", help)) - # Add Message Handlers + # on noncommand i.e message - echo the message on Bale dp.add_handler(MessageHandler(DefaultFilter(), echo)) - # Run the bot! + # log all errors + dp.add_error_handler(error) + + # Start the Bot updater.run() From a0d044fcbf7246abc8b5d2a287e2662478bb8f67 Mon Sep 17 00:00:00 2001 From: baleadmin Date: Thu, 14 Feb 2019 14:14:53 +0330 Subject: [PATCH 06/11] fix: FIX ContactFilter, EDIT and fix all examples ADD logger to examples --- balebot/filters/contact_filter.py | 6 +- examples/bank_receipt_conversation.py | 34 ++++--- examples/contact_conversation.py | 43 +++++---- examples/document_conversation.py | 105 ++++++++++++---------- examples/location_conversation.py | 44 +++++---- examples/photo_voice_conversation.py | 23 +++-- examples/purchase_conversation.py | 25 +++--- examples/quoted_message_conversation.py | 37 ++++---- examples/simple_edit_message.py | 33 ++++--- examples/template_message_conversation.py | 28 +++--- examples/text_conversation.py | 20 ++--- 11 files changed, 212 insertions(+), 186 deletions(-) diff --git a/balebot/filters/contact_filter.py b/balebot/filters/contact_filter.py index ef50ede..8017b20 100644 --- a/balebot/filters/contact_filter.py +++ b/balebot/filters/contact_filter.py @@ -5,8 +5,4 @@ class ContactFilter(Filter): def match(self, message): - if isinstance(message, JsonMessage): - raw_json = message.raw_json - return isinstance(raw_json, ContactMessage) - else: - return False + return isinstance(message, ContactMessage) diff --git a/examples/bank_receipt_conversation.py b/examples/bank_receipt_conversation.py index 3150cc0..65980b0 100644 --- a/examples/bank_receipt_conversation.py +++ b/examples/bank_receipt_conversation.py @@ -1,5 +1,7 @@ -"""Bank message conversation with bot -""" +#!/usr/bin/env python +# -*- coding: utf-8 -*- + +"""Bank message conversation with bot.""" import asyncio from balebot.filters import * @@ -8,28 +10,30 @@ from balebot.models.messages import * from balebot.models.messages.banking.money_request_type import MoneyRequestType from balebot.updater import Updater +from balebot.utils.logger import Logger # Bale Bot Authorization Token updater = Updater(token="TOKEN", loop=asyncio.get_event_loop()) dispatcher = updater.dispatcher +# Enable logging +logger = Logger.get_logger() + -def success(response, user_data): - print("success : ", response) - print(user_data) +def success_send_message(response, user_data): + logger.info("Your message has been sent successfully.", extra={"tag": "info"}) -def failure(response, user_data): - print("failure : ", response) - print(user_data) +def failure_send_message(response, user_data): + logger.error("Sending message has been failed", extra={"tag": "error"}) @dispatcher.command_handler(["/start"]) def conversation_starter(bot, update): message = TextMessage("Hi , nice to meet you :)\nplease send me a photo") user_peer = update.get_effective_user() - bot.send_message(message, user_peer, success_callback=success, failure_callback=failure) + bot.send_message(message, user_peer, success_callback=success_send_message, failure_callback=failure_send_message) dispatcher.register_conversation_next_step_handler(update, MessageHandler(PhotoFilter(), purchase_message)) @@ -39,23 +43,25 @@ def purchase_message(bot, update): user_peer = update.get_effective_user() first_purchase_message = PurchaseMessage(msg=message, account_number=6037991067471130, amount=100, money_request_type=MoneyRequestType.normal) - bot.send_message(first_purchase_message, user_peer, success_callback=success, failure_callback=failure) + bot.send_message(first_purchase_message, user_peer, success_callback=success_send_message, + failure_callback=failure_send_message) dispatcher.register_conversation_next_step_handler(update, [MessageHandler(BankMessageFilter(), payment), MessageHandler(DefaultFilter(), default_handler)]) def payment(bot, update): message = update.get_effective_message() - print("message:", message) + logger.info(str(message), extra={"tag": "info"}) success_payment = TextMessage("Thanks, your payment was successful") - bot.reply(update, success_payment, success_callback=success, failure_callback=failure) + bot.reply(update, success_payment, success_callback=success_send_message, failure_callback=failure_send_message) dispatcher.finish_conversation(update) def default_handler(bot, update): success_payment = TextMessage("Ops, something goes wrong") - bot.reply(update, success_payment, success_callback=success, failure_callback=failure) + bot.reply(update, success_payment, success_callback=success_send_message, failure_callback=failure_send_message) dispatcher.finish_conversation(update) -updater.run() +if __name__ == '__main__': + updater.run() diff --git a/examples/contact_conversation.py b/examples/contact_conversation.py index 752da27..05143b7 100644 --- a/examples/contact_conversation.py +++ b/examples/contact_conversation.py @@ -1,27 +1,31 @@ -"""Contact message conversation with bot -""" +#!/usr/bin/env python +# -*- coding: utf-8 -*- + +"""Contact message conversation with bot.""" import asyncio from balebot.filters import * -from balebot.handlers import MessageHandler, CommandHandler +from balebot.handlers import MessageHandler from balebot.models.messages import * from balebot.models.messages.contact_message import ContactMessage from balebot.updater import Updater +from balebot.utils.logger import Logger # Bale Bot Authorization Token updater = Updater(token="TOKEN", loop=asyncio.get_event_loop()) dispatcher = updater.dispatcher +# Enable logging +logger = Logger.get_logger() + -def success(response, user_data): - print("success : ", response) - print(user_data) +def success_send_message(response, user_data): + logger.info("Your message has been sent successfully.", extra={"tag": "info"}) -def failure(response, user_data): - print("failure : ", response) - print(user_data) +def failure_send_message(response, user_data): + logger.error("Sending message has been failed", extra={"tag": "error"}) @dispatcher.message_handler(filters=ContactFilter()) # filter text the client enter to bot @@ -31,24 +35,27 @@ def conversation_starter(bot, update): btn_list = [TemplateMessageButton(text="yes", value="yes", action=0), TemplateMessageButton(text="no", value="no", action=0)] template_message = TemplateMessage(general_message=general_message, btn_list=btn_list) - bot.send_message(template_message, user_peer, success_callback=success, failure_callback=failure) - dispatcher.register_conversation_next_step_handler(update, [MessageHandler(TemplateResponseFilter(keywords=["yes"]), - send_contact), - MessageHandler(TemplateResponseFilter(keywords=["no"]), - no_thanks)]) + bot.send_message(template_message, user_peer, success_callback=success_send_message, + failure_callback=failure_send_message) + dispatcher.register_conversation_next_step_handler( + update, [MessageHandler(TemplateResponseFilter(keywords=["yes"]), send_contact), + MessageHandler(TemplateResponseFilter(keywords=["no"]), no_thanks)]) def no_thanks(bot, update): - bot.reply(update, "It's Ok.", success_callback=success, failure_callback=failure) + bot.reply(update, "It's Ok.", success_callback=success_send_message, failure_callback=failure_send_message) dispatcher.finish_conversation(update) def send_contact(bot, update): user_peer = update.get_effective_user() - bot.respond(update, "Here is a contact for you.", success_callback=success, failure_callback=failure) + bot.respond(update, "Here is a contact for you.", success_callback=success_send_message, + failure_callback=failure_send_message) contact_message = ContactMessage(name="test contact", emails=["test@test.com"], phones=["09123456789"]) - bot.send_message(contact_message, user_peer, success_callback=success, failure_callback=failure) + bot.send_message(contact_message, user_peer, success_callback=success_send_message, + failure_callback=failure_send_message) dispatcher.finish_conversation(update) -updater.run() +if __name__ == '__main__': + updater.run() diff --git a/examples/document_conversation.py b/examples/document_conversation.py index 599061f..114def6 100644 --- a/examples/document_conversation.py +++ b/examples/document_conversation.py @@ -1,11 +1,14 @@ -"""Doc simple conversation with bot -""" +#!/usr/bin/env python +# -*- coding: utf-8 -*- + +"""Doc simple conversation with bot.""" import asyncio from balebot.filters import * from balebot.handlers import MessageHandler, CommandHandler from balebot.models.messages import * from balebot.updater import Updater +from balebot.utils.logger import Logger import datetime # Bale Bot Authorization Token @@ -13,43 +16,32 @@ loop=asyncio.get_event_loop()) dispatcher = updater.dispatcher - -def success(response, user_data): - print("success : ", response) - print(user_data) - - -def failure(response, user_data): - print("failure : ", response) - print(user_data) +# Enable logging +logger = Logger.get_logger() -def final_download_success(result, user_data): - print("download was successful : ", result) +def success_send_message(response, user_data): + logger.info("Your message has been sent successfully.", extra={"tag": "info"}) - stream = user_data.get("byte_stream", None) - now = str(datetime.datetime.now().time().strftime('%Y-%m-%d_%H:%M:%f')) - print(type(stream)) - with open("../files/doc_downloaded_" + now, "wb") as file: - file.write(stream) - file.close() +def failure_send_message(response, user_data): + logger.error("Sending message has been failed", extra={"tag": "error"}) @dispatcher.command_handler(["/start"]) def conversation_starter(bot, update): message = TextMessage("Hi , nice to meet you :)\nplease send me a contact.") user_peer = update.get_effective_user() - bot.send_message(message, user_peer, success_callback=success, failure_callback=failure) + bot.send_message(message, user_peer, success_callback=success_send_message, failure_callback=failure_send_message) dispatcher.register_conversation_next_step_handler(update, [MessageHandler(ContactFilter(), ask_contact), MessageHandler(DefaultFilter(), no_contact)]) def ask_contact(bot, update): user_peer = update.get_effective_user() - bot.reply(update, "its a contact", success_callback=success, failure_callback=failure) + bot.reply(update, "its a contact", success_callback=success_send_message, failure_callback=failure_send_message) message = TextMessage("Thanks \nplease send a document you want") - bot.send_message(message, user_peer, success_callback=success, failure_callback=failure) + bot.send_message(message, user_peer, success_callback=success_send_message, failure_callback=failure_send_message) dispatcher.register_conversation_next_step_handler(update, MessageHandler(DocumentFilter(), download_file)) @@ -57,30 +49,46 @@ def no_contact(bot, update): message = TextMessage("So, it seems you don't have any contact.\n you can try a upload a document here" "\n now send me a document") user_peer = update.get_effective_user() - bot.send_message(message, user_peer, success_callback=success, failure_callback=failure) + bot.send_message(message, user_peer, success_callback=success_send_message, failure_callback=failure_send_message) dispatcher.register_conversation_next_step_handler(update, MessageHandler(DocumentFilter(), download_file)) def download_file(bot, update): - def success_get_download_url(result, user_data): - print("success : ", result) - url = str(result.body.url) - url_link = TextMessage("Link of downloaded photo:\n(Note : this link is for limited time)\n" + url) - bot.send_message(url_link, user_peer, success_callback=success, failure_callback=failure) - - message = TextMessage("Downloading ... ") user_peer = update.get_effective_user() user_id = update.body.sender_user.peer_id - bot.send_message(message, user_peer, success_callback=success, failure_callback=failure) - file_id = update.body.message.file_id + message = TextMessage("Downloading ... ") + bot.send_message(message, user_peer, success_callback=success_send_message, failure_callback=failure_send_message) + file_id = update.get_effective_message().file_id + + def final_download_success(result, user_data): + logger.info("download was successful", extra={"tag": "info"}) + stream = user_data.get("byte_stream", None) + dispatcher.set_conversation_data(update, "stream", stream) + now = str(datetime.datetime.now().time().strftime('%Y-%m-%d_%H:%M:%f')) + with open("doc_downloaded_" + now, "wb") as file: + file.write(stream) + file.close() + + def final_download_failure(result, user_data): + logger.error("download was failure", extra={"tag": "error"}) + bot.download_file(file_id=file_id, user_id=user_id, file_type="file", success_callback=final_download_success, - failure_callback=failure) - bot.get_file_download_url(file_id, user_id, "file", success_callback=success_get_download_url, - failure_callback=failure) + failure_callback=final_download_failure) + + def get_download_url_success(result, user_data): + logger.info("get download url successful", extra={"tag": "info"}) + url = str(result.body.url) + logger.info("Link of downloaded photo:\n(Note : this link is for limited time)\n" + url, extra={"tag": "info"}) + + def get_download_url_failure(result, user_data): + logger.error("get download url failure", extra={"tag": "error"}) + + bot.get_file_download_url(file_id, user_id, "file", success_callback=get_download_url_success, + failure_callback=get_download_url_failure) message = TextMessage("Download was successful\n" - "use below command to upload that document we already downloaded\n" + "use below command to upload the document we already downloaded\n" "[/upload](send:/upload)") - bot.send_message(message, user_peer, success_callback=success, failure_callback=failure) + bot.send_message(message, user_peer, success_callback=success_send_message, failure_callback=final_download_success) dispatcher.register_conversation_next_step_handler(update, CommandHandler("upload", upload_file)) @@ -90,22 +98,22 @@ def file_upload_success(result, user_data): actually this link is just for uploading a file not download. If you want to download this file you should use get_file_download_url() and take a token from server. """ - print("upload was successful : ", result) - print(user_data) - url = user_data.get("url", None) - url_message = TextMessage(url) - bot.send_message(url_message, user_peer, success_callback=success, failure_callback=failure) + logger.info("file upload success", extra={"tag": "info"}) + + def file_upload_failure(result, user_data): + logger.error("file upload failure", extra={"tag": "error"}) message = TextMessage("Uploading ...") user_peer = update.get_effective_user() - bot.send_message(message, user_peer, success_callback=success, failure_callback=failure) - bot.upload_file(file="../files/upload_file_test.jpeg", file_type="file", success_callback=file_upload_success, - failure_callback=failure) + bot.send_message(message, user_peer, success_callback=success_send_message, failure_callback=failure_send_message) + stream = dispatcher.get_conversation_data(update, "stream") + bot.upload_file(file=stream, file_type="file", success_callback=file_upload_success, + failure_callback=file_upload_failure) message = TextMessage("Uploading is finish.\nyou can try this link and see nothing show to you\n" "finish conversion with below command\n" "[/finish](send:/finish)") - bot.send_message(message, user_peer, success_callback=success, failure_callback=failure) + bot.send_message(message, user_peer, success_callback=success_send_message, failure_callback=failure_send_message) dispatcher.register_conversation_next_step_handler(update, CommandHandler("/finish", finish_conversion)) @@ -113,8 +121,9 @@ def file_upload_success(result, user_data): def finish_conversion(bot, update): message = TextMessage("Thanks \ngoodbye ;)") user_peer = update.get_effective_user() - bot.send_message(message, user_peer, success_callback=success, failure_callback=failure) + bot.send_message(message, user_peer, success_callback=success_send_message, failure_callback=failure_send_message) dispatcher.finish_conversation(update) -updater.run() +if __name__ == '__main__': + updater.run() diff --git a/examples/location_conversation.py b/examples/location_conversation.py index f72eeb9..2b97f57 100644 --- a/examples/location_conversation.py +++ b/examples/location_conversation.py @@ -1,28 +1,31 @@ -"""Location message conversation with bot -""" +#!/usr/bin/env python +# -*- coding: utf-8 -*- + +"""Location message conversation with bot.""" import asyncio from balebot.filters import * -from balebot.handlers import MessageHandler, CommandHandler +from balebot.handlers import MessageHandler from balebot.models.messages import * from balebot.models.messages.location_message import LocationMessage from balebot.updater import Updater -import datetime +from balebot.utils.logger import Logger # Bale Bot Authorization Token updater = Updater(token="TOKEN", loop=asyncio.get_event_loop()) dispatcher = updater.dispatcher +# Enable logging +logger = Logger.get_logger() + -def success(response, user_data): - print("success : ", response) - print(user_data) +def success_send_message(response, user_data): + logger.info("Your message has been sent successfully.", extra={"tag": "info"}) -def failure(response, user_data): - print("failure : ", response) - print(user_data) +def failure_send_message(response, user_data): + logger.error("Sending message has been failed", extra={"tag": "error"}) @dispatcher.message_handler(filters=LocationFilter()) @@ -32,25 +35,28 @@ def conversation_starter(bot, update): btn_list = [TemplateMessageButton(text="yes", value="yes", action=0), TemplateMessageButton(text="no", value="no", action=0)] template_message = TemplateMessage(general_message=general_message, btn_list=btn_list) - bot.send_message(template_message, user_peer, success_callback=success, failure_callback=failure) - dispatcher.register_conversation_next_step_handler(update, [MessageHandler(TemplateResponseFilter(keywords=["yes"]), - find_location), - MessageHandler(TemplateResponseFilter(keywords=["no"]), - no_thanks)]) + bot.send_message(template_message, user_peer, success_callback=success_send_message, + failure_callback=failure_send_message) + dispatcher.register_conversation_next_step_handler( + update, [MessageHandler(TemplateResponseFilter(keywords=["yes"]), find_location), + MessageHandler(TemplateResponseFilter(keywords=["no"]), no_thanks)]) def no_thanks(bot, update): - bot.reply(update, "It's Ok.", success_callback=success, failure_callback=failure) + bot.reply(update, "It's Ok.", success_callback=success_send_message, failure_callback=failure_send_message) dispatcher.finish_conversation(update) def find_location(bot, update): user_peer = update.get_effective_user() - bot.reply(update, "Here is a good restaurant sir.", success_callback=success, failure_callback=failure) + bot.reply(update, "Here is a good restaurant sir.", success_callback=success_send_message, + failure_callback=failure_send_message) # Make a location from LocationMessage and send it. location_message = LocationMessage(longitude="51.41714821748457", latitude="35.73122955392002") - bot.send_message(location_message, user_peer, success_callback=success, failure_callback=failure) + bot.send_message(location_message, user_peer, success_callback=success_send_message, + failure_callback=failure_send_message) dispatcher.finish_conversation(update) -updater.run() +if __name__ == '__main__': + updater.run() diff --git a/examples/photo_voice_conversation.py b/examples/photo_voice_conversation.py index ab8bf06..3951d84 100644 --- a/examples/photo_voice_conversation.py +++ b/examples/photo_voice_conversation.py @@ -1,6 +1,8 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- + """Voice and Photo simple conversation with bot.""" import asyncio -import base64 from balebot.filters import * from balebot.handlers import MessageHandler @@ -12,28 +14,24 @@ updater = Updater(token="TOKEN", loop=asyncio.get_event_loop()) dispatcher = updater.dispatcher -my_logger = Logger.get_logger() # Create a logger and name it my_logger + +# Enable logging +logger = Logger.get_logger() def success_send_message(response, user_data): - kwargs = user_data['kwargs'] - update = kwargs["update"] - user_peer = update.get_effective_user() - my_logger.info("Your message has been sent successfully.", extra={"user_id": user_peer.peer_id, "tag": "info"}) + logger.info("Your message has been sent successfully.", extra={"tag": "info"}) def failure_send_message(response, user_data): - kwargs = user_data['kwargs'] - update = kwargs["update"] - user_peer = update.get_effective_user() - my_logger.error("Sending message has been failed", extra={"user_id": user_peer.peer_id, "tag": "error"}) + logger.error("Sending message has been failed", extra={"tag": "error"}) @dispatcher.command_handler(["/start"]) def conversation_starter(bot, update): message = TextMessage("Hi , nice to meet you :)" "\nif you want to see my photo," - "\nsend me a 'Hello' voice.") + "\nsend me a *voice*") user_peer = update.get_effective_user() bot.send_message(message, user_peer, success_callback=success_send_message, failure_callback=failure_send_message) dispatcher.register_conversation_next_step_handler(update, [MessageHandler(VoiceFilter(), get_voice), @@ -78,4 +76,5 @@ def finish_conversion(bot, update): dispatcher.finish_conversation(update) -updater.run() +if __name__ == '__main__': + updater.run() diff --git a/examples/purchase_conversation.py b/examples/purchase_conversation.py index 528df56..cda1632 100644 --- a/examples/purchase_conversation.py +++ b/examples/purchase_conversation.py @@ -1,3 +1,6 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- + """Purchase message simple conversation with bot.""" import asyncio @@ -12,21 +15,17 @@ updater = Updater(token="TOKEN", loop=asyncio.get_event_loop()) dispatcher = updater.dispatcher -my_logger = Logger.get_logger() # Create a logger and name it my_logger + +# Enable logging +logger = Logger.get_logger() def success_send_message(response, user_data): - kwargs = user_data['kwargs'] - update = kwargs["update"] - user_peer = update.get_effective_user() - my_logger.info("Your message has been sent successfully.", extra={"user_id": user_peer.peer_id, "tag": "info"}) + logger.info("Your message has been sent successfully.", extra={"tag": "info"}) def failure_send_message(response, user_data): - kwargs = user_data['kwargs'] - update = kwargs["update"] - user_peer = update.get_effective_user() - my_logger.error("Sending message has been failed", extra={"user_id": user_peer.peer_id, "tag": "error"}) + logger.error("Sending message has been failed", extra={"tag": "error"}) @dispatcher.command_handler(["/start"]) @@ -43,7 +42,6 @@ def conversation_starter(bot, update): def purchase_message(bot, update): message = update.get_effective_message() user_peer = update.get_effective_user() - # first_purchase_message = PurchaseMessage(msg=TextMessage('hey'), account_number=6037991067471130, amount=10, purchase_message = PurchaseMessage(msg=message, account_number=6037991067471130, amount=10, money_request_type=MoneyRequestType.normal) kwargs = {'update': update} @@ -61,8 +59,9 @@ def handle_receipt(bot, update): kwargs = {'update': update} bot.send_message(message, user_peer, success_callback=success_send_message, failure_callback=failure_send_message, kwargs=kwargs) - print(receipt) - print(receipt.payer, receipt.msgUID) + logger.info(receipt, extra={"tag": "info"}) + logger.info(receipt.payer, receipt.msgUID, extra={"tag": "info"}) -updater.run() +if __name__ == '__main__': + updater.run() diff --git a/examples/quoted_message_conversation.py b/examples/quoted_message_conversation.py index 3f18cb5..883e32b 100644 --- a/examples/quoted_message_conversation.py +++ b/examples/quoted_message_conversation.py @@ -1,43 +1,41 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- + """QuotedMessage conversation with bot.""" import asyncio from balebot.filters import * -from balebot.handlers import MessageHandler, QuotedMessageHandler +from balebot.handlers import QuotedMessageHandler from balebot.models.messages import * from balebot.updater import Updater from balebot.utils.logger import Logger # Bale Bot Authorization Token -updater = Updater(token="PUT YOUR TOKEN HERE", +updater = Updater(token="TOKEN", loop=asyncio.get_event_loop()) dispatcher = updater.dispatcher -my_logger = Logger.get_logger() # Create a logger and name it my_logger + +# Enable logging +logger = Logger.get_logger() def success_send_message(response, user_data): - kwargs = user_data['kwargs'] - update = kwargs["update"] - user_peer = update.get_effective_user() - my_logger.info("Your message has been sent successfully.", extra={"user_id": user_peer.peer_id, "tag": "info"}) + logger.info("Your message has been sent successfully.", extra={"tag": "info"}) def failure_send_message(response, user_data): - kwargs = user_data['kwargs'] - update = kwargs["update"] - user_peer = update.get_effective_user() - my_logger.error("Sending message has been failed", extra={"user_id": user_peer.peer_id, "tag": "error"}) + logger.error("Sending message has been failed", extra={"tag": "error"}) @dispatcher.command_handler(["/start"]) def conversation_starter(bot, update): - message = TextMessage("*Hi , nice to meet you*\nplease forward or reply message to me.") + message = TextMessage("*Hi , nice to meet you*\nplease forward a message to me.") user_peer = update.get_effective_user() kwargs = {"message": message, "update": update} - bot.send_message(message, user_peer, success_callback=success_send_message, failure_callback=failure_send_message, - kwargs=kwargs) - dispatcher.register_conversation_next_step_handler(update, [ - QuotedMessageHandler(DefaultFilter(), echo_quoted) - ]) + bot.send_message(message, user_peer, success_callback=success_send_message, + failure_callback=failure_send_message, kwargs=kwargs) + dispatcher.register_conversation_next_step_handler( + update, [QuotedMessageHandler(DefaultFilter(), echo_quoted)]) @dispatcher.quoted_message_handler(DefaultFilter()) @@ -45,11 +43,12 @@ def echo_quoted(bot, update): user_peer = update.get_effective_user() kwargs = {'update': update} quoted_sender_id = update.get_quoted_sender_peer_id() - print("replied or forwarded message from peer_id: " + str(quoted_sender_id)) + logger.debug("replied or forwarded message from peer_id: " + str(quoted_sender_id), extra={"tag": "debug"}) output = update.get_quoted_message() bot.send_message(output, user_peer, success_callback=success_send_message, failure_callback=failure_send_message, kwargs=kwargs) dispatcher.finish_conversation(update) -updater.run() +if __name__ == '__main__': + updater.run() diff --git a/examples/simple_edit_message.py b/examples/simple_edit_message.py index 66df544..5dd8d46 100644 --- a/examples/simple_edit_message.py +++ b/examples/simple_edit_message.py @@ -1,8 +1,10 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- + """Simple Bot to edit Bale messages.""" import asyncio -from balebot.filters import DefaultFilter, TextFilter from balebot.models.messages import TextMessage from balebot.updater import Updater from balebot.utils.logger import Logger @@ -13,23 +15,27 @@ loop=asyncio.get_event_loop()) # Define dispatcher dispatcher = updater.dispatcher -my_logger = Logger.get_logger() # Create a logger and name it my_logger + +# Enable logging +logger = Logger.get_logger() # Both of success and failure functions are optional def success_send_message(response, user_data): - kwargs = user_data['kwargs'] - update = kwargs["update"] - user_peer = update.get_effective_user() - my_logger.info("Your message has been sent successfully.", extra={"user_id": user_peer.peer_id, "tag": "info"}) + logger.info("Your message has been sent successfully.", extra={"tag": "info"}) def failure_send_message(response, user_data): - kwargs = user_data['kwargs'] - update = kwargs["update"] - user_peer = update.get_effective_user() - my_logger.error("Sending message has been failed", extra={"user_id": user_peer.peer_id, "tag": "error"}) + logger.error("Sending message has been failed", extra={"tag": "error"}) + + +def success_edit_message(response, user_data): + logger.info("Your message has been edited successfully.", extra={"tag": "info"}) + + +def failure_edit_message(response, user_data): + logger.error("Editing message has been failed", extra={"tag": "error"}) request_random_id = None @@ -42,7 +48,7 @@ def start(bot, update): request = bot.respond(update, message, success_callback=success_send_message, failure_callback=failure_send_message) global request_random_id request_random_id = request.get_json_object()['body']['randomId'] - print(request_random_id) + logger.debug(request_random_id, extra={"tag": "debug"}) @dispatcher.command_handler(commands='/edit') @@ -51,8 +57,9 @@ def edit(bot, update): message = TextMessage('*message edited*') # edit nd a message to client bot.edit_message(message=message, user_peer=user_peer, random_id=request_random_id, - success_callback=success_send_message, failure_callback=failure_send_message) + success_callback=success_edit_message, failure_callback=failure_edit_message) # Run the bot! -updater.run() +if __name__ == '__main__': + updater.run() diff --git a/examples/template_message_conversation.py b/examples/template_message_conversation.py index 6cede4f..21b5d5f 100644 --- a/examples/template_message_conversation.py +++ b/examples/template_message_conversation.py @@ -1,3 +1,6 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- + """Template simple conversation with bot.""" import asyncio @@ -11,21 +14,17 @@ updater = Updater(token="TOKEN", loop=asyncio.get_event_loop()) dispatcher = updater.dispatcher -my_logger = Logger.get_logger() # Create a logger and name it my_logger + +# Enable logging +logger = Logger.get_logger() def success_send_message(response, user_data): - kwargs = user_data['kwargs'] - update = kwargs["update"] - user_peer = update.get_effective_user() - my_logger.info("Your message has been sent successfully.", extra={"user_id": user_peer.peer_id, "tag": "info"}) + logger.info("Your message has been sent successfully.", extra={"tag": "info"}) def failure_send_message(response, user_data): - kwargs = user_data['kwargs'] - update = kwargs["update"] - user_peer = update.get_effective_user() - my_logger.error("Sending message has been failed", extra={"user_id": user_peer.peer_id, "tag": "error"}) + logger.error("Sending message has been failed", extra={"tag": "error"}) @dispatcher.command_handler(["/start"]) @@ -50,11 +49,9 @@ def ask_question(bot, update): template_message = TemplateMessage(general_message=general_message, btn_list=btn_list) bot.send_message(template_message, user_peer, success_callback=success_send_message, failure_callback=failure_send_message) - dispatcher.register_conversation_next_step_handler(update, - [MessageHandler(TemplateResponseFilter(keywords=["yes"]), - positive_answer), - MessageHandler(TemplateResponseFilter(keywords=["no"]), - negative_answer)]) + dispatcher.register_conversation_next_step_handler( + update, [MessageHandler(TemplateResponseFilter(keywords=["yes"]), positive_answer), + MessageHandler(TemplateResponseFilter(keywords=["no"]), negative_answer)]) # Use when answer is 'yes' @@ -86,4 +83,5 @@ def finish_conversion(bot, update): dispatcher.finish_conversation(update) -updater.run() +if __name__ == '__main__': + updater.run() diff --git a/examples/text_conversation.py b/examples/text_conversation.py index 14a945c..a3f4b02 100644 --- a/examples/text_conversation.py +++ b/examples/text_conversation.py @@ -1,3 +1,6 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- + """Text simple conversation with bot.""" import asyncio @@ -11,21 +14,17 @@ updater = Updater(token="TOKEN", loop=asyncio.get_event_loop()) dispatcher = updater.dispatcher -my_logger = Logger.get_logger() # Create a logger and name it my_logger + +# Enable logging +logger = Logger.get_logger() def success_send_message(response, user_data): - kwargs = user_data['kwargs'] - update = kwargs["update"] - user_peer = update.get_effective_user() - my_logger.info("Your message has been sent successfully.", extra={"user_id": user_peer.peer_id, "tag": "info"}) + logger.info("Your message has been sent successfully.", extra={"tag": "info"}) def failure_send_message(response, user_data): - kwargs = user_data['kwargs'] - update = kwargs["update"] - user_peer = update.get_effective_user() - my_logger.error("Sending message has been failed", extra={"user_id": user_peer.peer_id, "tag": "error"}) + logger.error("Sending message has been failed", extra={"tag": "error"}) @dispatcher.command_handler(["/start"]) @@ -84,4 +83,5 @@ def finish_conversion(bot, update): dispatcher.finish_conversation(update) -updater.run() +if __name__ == '__main__': + updater.run() From a4b6558cc9245c9c9f2653642df9b804a0d3f808 Mon Sep 17 00:00:00 2001 From: baleadmin Date: Thu, 14 Feb 2019 14:50:10 +0330 Subject: [PATCH 07/11] fix: FIX success and failure callbacks --- balebot/bale_future.py | 1 - examples/photo_voice_conversation.py | 24 +++++++++++++----- examples/purchase_conversation.py | 12 ++++++--- examples/quoted_message_conversation.py | 10 ++++++-- examples/simple_edit_message.py | 15 ++++++++--- examples/template_message_conversation.py | 31 +++++++++++++++++------ examples/text_conversation.py | 13 +++++++--- 7 files changed, 78 insertions(+), 28 deletions(-) diff --git a/balebot/bale_future.py b/balebot/bale_future.py index c033f72..384e871 100644 --- a/balebot/bale_future.py +++ b/balebot/bale_future.py @@ -1,4 +1,3 @@ -from asyncio import Future import collections diff --git a/examples/photo_voice_conversation.py b/examples/photo_voice_conversation.py index 3951d84..132e611 100644 --- a/examples/photo_voice_conversation.py +++ b/examples/photo_voice_conversation.py @@ -20,11 +20,17 @@ def success_send_message(response, user_data): - logger.info("Your message has been sent successfully.", extra={"tag": "info"}) + kwargs = user_data['kwargs'] + update = kwargs["update"] + user_peer = update.get_effective_user() + logger.info("Your message has been sent successfully.", extra={"user_id": user_peer.peer_id, "tag": "info"}) def failure_send_message(response, user_data): - logger.error("Sending message has been failed", extra={"tag": "error"}) + kwargs = user_data['kwargs'] + update = kwargs["update"] + user_peer = update.get_effective_user() + logger.error("Sending message has been failed", extra={"user_id": user_peer.peer_id, "tag": "error"}) @dispatcher.command_handler(["/start"]) @@ -33,7 +39,9 @@ def conversation_starter(bot, update): "\nif you want to see my photo," "\nsend me a *voice*") user_peer = update.get_effective_user() - bot.send_message(message, user_peer, success_callback=success_send_message, failure_callback=failure_send_message) + kwargs = {'update': update} + bot.send_message(message, user_peer, success_callback=success_send_message, failure_callback=failure_send_message, + kwargs=kwargs) dispatcher.register_conversation_next_step_handler(update, [MessageHandler(VoiceFilter(), get_voice), MessageHandler(DefaultFilter(), skip_voice)]) @@ -41,13 +49,14 @@ def conversation_starter(bot, update): @dispatcher.message_handler(VoiceFilter()) def get_voice(bot, update): user_peer = update.get_effective_user() + kwargs = {'update': update} def success_send_photo_message(result, user_data): message = TextMessage("Hahahaha! It's me." "\nNow It's your turn." "\nSend me your photo:") bot.send_message(message, user_peer, success_callback=success_send_message, - failure_callback=failure_send_message) + failure_callback=failure_send_message, kwargs=kwargs) dispatcher.register_conversation_next_step_handler(update, MessageHandler(PhotoFilter(), finish_conversion)) bot.send_photo(user_peer=user_peer, image="./assets/happy-bot.jpeg", caption_text="caption comes here!", @@ -67,10 +76,11 @@ def skip_voice(bot, update): def finish_conversion(bot, update): user_peer = update.get_effective_user() - v_message = update.get_effective_message() - bot.reply(update, v_message, success_callback=success_send_message, failure_callback=failure_send_message) - message = TextMessage("Thanks \ngoodbye ;)") + photo_message_given = update.get_effective_message() kwargs = {'update': update} + bot.reply(update, photo_message_given, success_callback=success_send_message, failure_callback=failure_send_message, + kwargs=kwargs) + message = TextMessage("Thanks \ngoodbye ;)") bot.send_message(message, user_peer, success_callback=success_send_message, failure_callback=failure_send_message, kwargs=kwargs) dispatcher.finish_conversation(update) diff --git a/examples/purchase_conversation.py b/examples/purchase_conversation.py index cda1632..e503a1d 100644 --- a/examples/purchase_conversation.py +++ b/examples/purchase_conversation.py @@ -21,11 +21,17 @@ def success_send_message(response, user_data): - logger.info("Your message has been sent successfully.", extra={"tag": "info"}) + kwargs = user_data['kwargs'] + update = kwargs["update"] + user_peer = update.get_effective_user() + logger.info("Your message has been sent successfully.", extra={"user_id": user_peer.peer_id, "tag": "info"}) def failure_send_message(response, user_data): - logger.error("Sending message has been failed", extra={"tag": "error"}) + kwargs = user_data['kwargs'] + update = kwargs["update"] + user_peer = update.get_effective_user() + logger.error("Sending message has been failed", extra={"user_id": user_peer.peer_id, "tag": "error"}) @dispatcher.command_handler(["/start"]) @@ -55,8 +61,8 @@ def handle_receipt(bot, update): bank_message = update.get_effective_message() user_peer = update.get_effective_user() receipt = bank_message.get_receipt() - message = TextMessage("your payment receipt received with trace Number: {}".format(receipt.traceNo)) kwargs = {'update': update} + message = TextMessage("your payment receipt received with trace Number: {}".format(receipt.traceNo)) bot.send_message(message, user_peer, success_callback=success_send_message, failure_callback=failure_send_message, kwargs=kwargs) logger.info(receipt, extra={"tag": "info"}) diff --git a/examples/quoted_message_conversation.py b/examples/quoted_message_conversation.py index 883e32b..e252fd8 100644 --- a/examples/quoted_message_conversation.py +++ b/examples/quoted_message_conversation.py @@ -20,11 +20,17 @@ def success_send_message(response, user_data): - logger.info("Your message has been sent successfully.", extra={"tag": "info"}) + kwargs = user_data['kwargs'] + update = kwargs["update"] + user_peer = update.get_effective_user() + logger.info("Your message has been sent successfully.", extra={"user_id": user_peer.peer_id, "tag": "info"}) def failure_send_message(response, user_data): - logger.error("Sending message has been failed", extra={"tag": "error"}) + kwargs = user_data['kwargs'] + update = kwargs["update"] + user_peer = update.get_effective_user() + logger.error("Sending message has been failed", extra={"user_id": user_peer.peer_id, "tag": "error"}) @dispatcher.command_handler(["/start"]) diff --git a/examples/simple_edit_message.py b/examples/simple_edit_message.py index 5dd8d46..971c3cd 100644 --- a/examples/simple_edit_message.py +++ b/examples/simple_edit_message.py @@ -21,13 +21,18 @@ # Both of success and failure functions are optional - def success_send_message(response, user_data): - logger.info("Your message has been sent successfully.", extra={"tag": "info"}) + kwargs = user_data['kwargs'] + update = kwargs["update"] + user_peer = update.get_effective_user() + logger.info("Your message has been sent successfully.", extra={"user_id": user_peer.peer_id, "tag": "info"}) def failure_send_message(response, user_data): - logger.error("Sending message has been failed", extra={"tag": "error"}) + kwargs = user_data['kwargs'] + update = kwargs["update"] + user_peer = update.get_effective_user() + logger.error("Sending message has been failed", extra={"user_id": user_peer.peer_id, "tag": "error"}) def success_edit_message(response, user_data): @@ -45,7 +50,9 @@ def failure_edit_message(response, user_data): def start(bot, update): message = TextMessage('*Hello this message will be edited when you send /edit command*') # Send a message to client - request = bot.respond(update, message, success_callback=success_send_message, failure_callback=failure_send_message) + kwargs = {"update": update} + request = bot.respond(update, message, success_callback=success_send_message, failure_callback=failure_send_message, + kwargs=kwargs) global request_random_id request_random_id = request.get_json_object()['body']['randomId'] logger.debug(request_random_id, extra={"tag": "debug"}) diff --git a/examples/template_message_conversation.py b/examples/template_message_conversation.py index 21b5d5f..d0445e1 100644 --- a/examples/template_message_conversation.py +++ b/examples/template_message_conversation.py @@ -20,26 +20,35 @@ def success_send_message(response, user_data): - logger.info("Your message has been sent successfully.", extra={"tag": "info"}) + kwargs = user_data['kwargs'] + update = kwargs["update"] + user_peer = update.get_effective_user() + logger.info("Your message has been sent successfully.", extra={"user_id": user_peer.peer_id, "tag": "info"}) def failure_send_message(response, user_data): - logger.error("Sending message has been failed", extra={"tag": "error"}) + kwargs = user_data['kwargs'] + update = kwargs["update"] + user_peer = update.get_effective_user() + logger.error("Sending message has been failed", extra={"user_id": user_peer.peer_id, "tag": "error"}) @dispatcher.command_handler(["/start"]) def conversation_starter(bot, update): message = TextMessage("*Hi , come try a interesting message* \nplease tell me a *yes-no* question.") user_peer = update.get_effective_user() - bot.send_message(message, user_peer, success_callback=success_send_message, failure_callback=failure_send_message) + kwargs = {"update": update} + bot.send_message(message, user_peer, success_callback=success_send_message, failure_callback=failure_send_message, + kwargs=kwargs) dispatcher.register_conversation_next_step_handler(update, MessageHandler(TextFilter(), ask_question)) def ask_question(bot, update): user_peer = update.get_effective_user() my_message = TextMessage("*Your Template Message created!*") + kwargs = {"update": update} bot.send_message(my_message, user_peer, success_callback=success_send_message, - failure_callback=failure_send_message) + failure_callback=failure_send_message, kwargs=kwargs) # Set client message as general message of a template message general_message = update.get_effective_message() # Create how many buttons you like with TemplateMessageButton class @@ -48,7 +57,7 @@ def ask_question(bot, update): # Create a Template Message template_message = TemplateMessage(general_message=general_message, btn_list=btn_list) bot.send_message(template_message, user_peer, success_callback=success_send_message, - failure_callback=failure_send_message) + failure_callback=failure_send_message, kwargs=kwargs) dispatcher.register_conversation_next_step_handler( update, [MessageHandler(TemplateResponseFilter(keywords=["yes"]), positive_answer), MessageHandler(TemplateResponseFilter(keywords=["no"]), negative_answer)]) @@ -60,7 +69,9 @@ def positive_answer(bot, update): "end the conversion with below command: \n" "[/end](send:/end)") user_peer = update.get_effective_user() - bot.send_message(message, user_peer, success_callback=success_send_message, failure_callback=failure_send_message) + kwargs = {"update": update} + bot.send_message(message, user_peer, success_callback=success_send_message, failure_callback=failure_send_message, + kwargs=kwargs) # Use CommandHandler to handle a command which is sent by client dispatcher.register_conversation_next_step_handler(update, CommandHandler("/end", finish_conversion)) @@ -71,14 +82,18 @@ def negative_answer(bot, update): "Write a new question or end the conversion with below command: \n" "[/end](send:/end)") user_peer = update.get_effective_user() - bot.send_message(message, user_peer, success_callback=success_send_message, failure_callback=failure_send_message) + kwargs = {"update": update} + bot.send_message(message, user_peer, success_callback=success_send_message, failure_callback=failure_send_message, + kwargs=kwargs) dispatcher.register_conversation_next_step_handler(update, [CommandHandler("/end", finish_conversion)]) def finish_conversion(bot, update): message = TextMessage("*Thanks* \ngoodbye ;)") user_peer = update.get_effective_user() - bot.send_message(message, user_peer, success_callback=success_send_message, failure_callback=failure_send_message) + kwargs = {"update": update} + bot.send_message(message, user_peer, success_callback=success_send_message, failure_callback=failure_send_message, + kwargs=kwargs) # Finish conversation dispatcher.finish_conversation(update) diff --git a/examples/text_conversation.py b/examples/text_conversation.py index a3f4b02..afa2899 100644 --- a/examples/text_conversation.py +++ b/examples/text_conversation.py @@ -20,11 +20,17 @@ def success_send_message(response, user_data): - logger.info("Your message has been sent successfully.", extra={"tag": "info"}) + kwargs = user_data['kwargs'] + update = kwargs["update"] + user_peer = update.get_effective_user() + logger.info("Your message has been sent successfully.", extra={"user_id": user_peer.peer_id, "tag": "info"}) def failure_send_message(response, user_data): - logger.error("Sending message has been failed", extra={"tag": "error"}) + kwargs = user_data['kwargs'] + update = kwargs["update"] + user_peer = update.get_effective_user() + logger.error("Sending message has been failed", extra={"user_id": user_peer.peer_id, "tag": "error"}) @dispatcher.command_handler(["/start"]) @@ -79,7 +85,8 @@ def finish_conversion(bot, update): name = dispatcher.get_conversation_data(update, key="name") age = update.get_effective_message().text output = TextMessage("*Name:* " + name + "\n" + "*Age:* " + age) - bot.send_message(output, user_peer, success_callback=success_send_message, failure_callback=failure_send_message) + bot.send_message(output, user_peer, success_callback=success_send_message, failure_callback=failure_send_message, + kwargs=kwargs) dispatcher.finish_conversation(update) From d911d5a0e889f0113fdcb2ff4a386f6edadb99d6 Mon Sep 17 00:00:00 2001 From: baleadmin Date: Thu, 14 Feb 2019 15:01:17 +0330 Subject: [PATCH 08/11] fix: fix text_message --- balebot/handlers/command_handler.py | 2 +- balebot/models/messages/template_response_message.py | 6 +++--- balebot/models/messages/text_message.py | 1 + 3 files changed, 5 insertions(+), 4 deletions(-) diff --git a/balebot/handlers/command_handler.py b/balebot/handlers/command_handler.py index 455a495..118d5e5 100644 --- a/balebot/handlers/command_handler.py +++ b/balebot/handlers/command_handler.py @@ -20,7 +20,7 @@ def check_update(self, update): if isinstance(message, TextMessage): message_text = message.text.lower() elif self.include_template_response and isinstance(message, TemplateResponseMessage): - message_text = message.text.lower() + message_text = message.text_message.lower() else: return False diff --git a/balebot/models/messages/template_response_message.py b/balebot/models/messages/template_response_message.py index 24c88ce..6b34bb4 100644 --- a/balebot/models/messages/template_response_message.py +++ b/balebot/models/messages/template_response_message.py @@ -32,10 +32,10 @@ def load_from_json(cls, json): else: raise ValueError(Error.unacceptable_json) - text = json_dict.get("textMessage", None) + text_message = json_dict.get("textMessage", None) template_message_response_id = json_dict.get("templateMessageResponseId", None) - if (text is None) or (template_message_response_id is None): + if (text_message is None) or (template_message_response_id is None): raise ValueError(Error.none_or_invalid_attribute) - return cls(text=text, template_message_response_id=template_message_response_id) + return cls(text=text_message, template_message_response_id=template_message_response_id) diff --git a/balebot/models/messages/text_message.py b/balebot/models/messages/text_message.py index b2d25f8..df0862d 100644 --- a/balebot/models/messages/text_message.py +++ b/balebot/models/messages/text_message.py @@ -8,6 +8,7 @@ class TextMessage(BaseMessage): def __init__(self, text): + self.text = str(text) if text else "" def get_json_object(self): From 0ad7879cfad98fd024ed60c6b5cc882a4bc17d89 Mon Sep 17 00:00:00 2001 From: baleadmin Date: Thu, 14 Feb 2019 15:09:07 +0330 Subject: [PATCH 09/11] fix: fix if text is in keywords. --- balebot/filters/template_response_filter.py | 5 ++--- balebot/filters/text_filter.py | 5 ++--- 2 files changed, 4 insertions(+), 6 deletions(-) diff --git a/balebot/filters/template_response_filter.py b/balebot/filters/template_response_filter.py index deafbc3..ded9dd8 100644 --- a/balebot/filters/template_response_filter.py +++ b/balebot/filters/template_response_filter.py @@ -37,9 +37,8 @@ def match(self, message): def find_keywords(self, text): for keyword in self.keywords: - if keyword: - if text.find(keyword) != -1: - return True + if keyword == text: + return True return False def find_pattern(self, text): diff --git a/balebot/filters/text_filter.py b/balebot/filters/text_filter.py index 3e78f0a..a342e38 100644 --- a/balebot/filters/text_filter.py +++ b/balebot/filters/text_filter.py @@ -37,9 +37,8 @@ def match(self, message): def find_keywords(self, text): for keyword in self.keywords: - if keyword: - if text.find(keyword) != -1: - return True + if keyword == text: + return True return False def find_pattern(self, text): From 8d7c128c62ef70957dd8eb1dec4a00514284b779 Mon Sep 17 00:00:00 2001 From: baleadmin Date: Mon, 25 Feb 2019 10:42:24 +0330 Subject: [PATCH 10/11] feat: ADD exact_keywords to text and template filters. --- balebot/filters/template_response_filter.py | 23 +++++++++++++++------ balebot/filters/text_filter.py | 22 ++++++++++++++------ 2 files changed, 33 insertions(+), 12 deletions(-) diff --git a/balebot/filters/template_response_filter.py b/balebot/filters/template_response_filter.py index ded9dd8..a85c15f 100644 --- a/balebot/filters/template_response_filter.py +++ b/balebot/filters/template_response_filter.py @@ -4,13 +4,18 @@ class TemplateResponseFilter(Filter): - def __init__(self, keywords=None, pattern=None, validator=None, include_commands=True): + def __init__(self, keywords=None, exact_keywords=None, pattern=None, validator=None, include_commands=True): super(TemplateResponseFilter, self).__init__(validator) self.keywords = [] + self.exact_keywords = [] if isinstance(keywords, list): self.keywords += keywords elif isinstance(keywords, str): self.keywords.append(keywords) + if isinstance(exact_keywords, list): + self.exact_keywords += exact_keywords + elif isinstance(keywords, str): + self.exact_keywords.append(exact_keywords) self.pattern = pattern self.validator = validator if callable(validator) else None @@ -19,15 +24,14 @@ def __init__(self, keywords=None, pattern=None, validator=None, include_commands def match(self, message): if isinstance(message, TemplateResponseMessage): text = message.text - if not self.include_commands: - if text.startswith("/"): - return False - + if not self.include_commands and text.startswith("/"): + return False if not self.pattern and not self.keywords and not self.validator: return True - if self.find_keywords(text): return True + elif self.find_exact_keywords(text): + return True elif self.find_pattern(text): return True elif self.validate(text): @@ -37,6 +41,13 @@ def match(self, message): def find_keywords(self, text): for keyword in self.keywords: + if keyword: + if text.find(keyword) != -1: + return True + return False + + def find_exact_keywords(self, text): + for keyword in self.exact_keywords: if keyword == text: return True return False diff --git a/balebot/filters/text_filter.py b/balebot/filters/text_filter.py index a342e38..8e7123e 100644 --- a/balebot/filters/text_filter.py +++ b/balebot/filters/text_filter.py @@ -4,13 +4,18 @@ class TextFilter(Filter): - def __init__(self, keywords=None, pattern=None, validator=None, include_commands=True): + def __init__(self, keywords=None, exact_keywords=None, pattern=None, validator=None, include_commands=True): super(TextFilter, self).__init__(validator) self.keywords = [] + self.exact_keywords = [] if isinstance(keywords, list): self.keywords += keywords elif isinstance(keywords, str): self.keywords.append(keywords) + if isinstance(exact_keywords, list): + self.exact_keywords += exact_keywords + elif isinstance(keywords, str): + self.exact_keywords.append(exact_keywords) self.pattern = pattern self.validator = validator if callable(validator) else None @@ -19,15 +24,14 @@ def __init__(self, keywords=None, pattern=None, validator=None, include_commands def match(self, message): if isinstance(message, TextMessage): text = message.text - if not self.include_commands: - if text.startswith("/"): - return False - + if not self.include_commands and text.startswith("/"): + return False if not self.pattern and not self.keywords and not self.validator: return True - if self.find_keywords(text): return True + elif self.find_exact_keywords(text): + return True elif self.find_pattern(text): return True elif self.validate(text): @@ -41,6 +45,12 @@ def find_keywords(self, text): return True return False + def find_exact_keywords(self, text): + for keyword in self.exact_keywords: + if keyword == text: + return True + return False + def find_pattern(self, text): if self.pattern: return re.search(self.pattern, text) From 5fd4311c736293267487192a2fa4c1941cff80b1 Mon Sep 17 00:00:00 2001 From: baleadmin Date: Mon, 25 Feb 2019 16:41:15 +0330 Subject: [PATCH 11/11] feat: ADD send to channel by nickName EDIT default group shield value. ADD termination signal handler. --- balebot/bot.py | 5 ++--- balebot/config.py | 2 +- .../client_requests/messaging/send_message.py | 16 ++++++++++------ balebot/updater.py | 2 ++ 4 files changed, 15 insertions(+), 10 deletions(-) diff --git a/balebot/bot.py b/balebot/bot.py index 482adbb..43c07fd 100644 --- a/balebot/bot.py +++ b/balebot/bot.py @@ -81,9 +81,8 @@ def respond(self, update, message, success_callback=None, failure_callback=None, # messaging def send_message(self, message, peer, quoted_message=None, random_id=None, success_callback=None, failure_callback=None, **kwargs): - receiver = peer - request_body = SendMessage(message=message, receiver_peer=receiver, - quoted_message=quoted_message, random_id=random_id) + request_body = SendMessage(message=message, receiver_user=peer, quoted_message=quoted_message, + random_id=random_id) request = Request(service=ServiceType.Messaging, body=request_body) self.set_future(request.id, request_body, success_callback, failure_callback, **kwargs) self.send_request(request.get_json_str()) diff --git a/balebot/config.py b/balebot/config.py index ba0e5c4..201a104 100644 --- a/balebot/config.py +++ b/balebot/config.py @@ -23,4 +23,4 @@ class Config: redis_host = os.getenv('REDIS_HOST', "localhost") redis_port = int(os.getenv('REDIS_PORT', 6379)) redis_db = os.getenv('REDIS_DB', 0) - group_shield = int(os.getenv('GROUP_SHIELD', 1)) + group_shield = int(os.getenv('GROUP_SHIELD', 0)) diff --git a/balebot/models/client_requests/messaging/send_message.py b/balebot/models/client_requests/messaging/send_message.py index 0be428f..26dba68 100644 --- a/balebot/models/client_requests/messaging/send_message.py +++ b/balebot/models/client_requests/messaging/send_message.py @@ -10,13 +10,14 @@ class SendMessage(RequestBody): - def __init__(self, message, receiver_peer, quoted_message=None, random_id=None): + def __init__(self, message, receiver_user, quoted_message=None, random_id=None): - if isinstance(message, BaseMessage) and isinstance(receiver_peer, Peer) and ( - isinstance(quoted_message, BotQuotedMessage) or not quoted_message): + if isinstance(message, BaseMessage) and ( + isinstance(receiver_user, Peer) or isinstance(receiver_user, str)) and ( + isinstance(quoted_message, BotQuotedMessage) or not quoted_message): self.message = message - self.receiver_peer = receiver_peer + self.receiver_user = receiver_user self.quoted_message = quoted_message if random_id: @@ -31,13 +32,16 @@ def get_json_object(self): data = { "$type": RequestType.send_message, - "peer": self.receiver_peer.get_json_object(), "randomId": self._random_id, "message": self.message.get_json_object(), "quotedMessage": self.quoted_message.get_json_object() if self.quoted_message else None, } + if isinstance(self.receiver_user, Peer): + data["peer"] = self.receiver_user.get_json_object() + else: + data["nickName"] = self.receiver_user return data def get_json_str(self): - return json_handler.dumps(self.get_json_object()) + return json_handler.dumps(self.get_json_object()) \ No newline at end of file diff --git a/balebot/updater.py b/balebot/updater.py index 23120df..5d38221 100644 --- a/balebot/updater.py +++ b/balebot/updater.py @@ -1,5 +1,6 @@ import asyncio import pickle +import signal import traceback from collections import namedtuple @@ -39,6 +40,7 @@ def __init__(self, token, base_url=Config.base_url, loop=None): self.running = False def run(self, stop_after=None): + signal.signal(signal.SIGTERM, self.stop) if Config.state_holder: bot_previous_state = redis_db.get(self.token) bot_previous_state = pickle.loads(bot_previous_state) if bot_previous_state else None