diff --git a/.gitignore b/.gitignore index c8c5175..3b760cd 100644 --- a/.gitignore +++ b/.gitignore @@ -127,4 +127,8 @@ dmypy.json # Pyre type checker .pyre/ -token.txt \ No newline at end of file +token.txt +.idea/ +logs/ +**/logs/ +**/log.txt diff --git a/examples/advanced/message-file-bot.py b/examples/advanced/message-file-bot.py new file mode 100644 index 0000000..ddfdd76 --- /dev/null +++ b/examples/advanced/message-file-bot.py @@ -0,0 +1,99 @@ +"""send contact card to specific contact""" +# pylint: disable=R0801 +import asyncio +import logging +from typing import Optional, Union + +from wechaty_puppet import FileBox, ScanStatus # type: ignore +from wechaty_puppet import MessageType + +from wechaty import Wechaty, Contact +from wechaty.user import Message, Room + +logging.basicConfig(level=logging.INFO) +log = logging.getLogger(__name__) + + +class MyBot(Wechaty): + """ + listen wechaty event with inherited functions, which is more friendly for + oop developer + """ + def __init__(self): + super().__init__() + + async def on_message(self, msg: Message): + """ + listen for message event + """ + from_contact = msg.talker() + text = msg.text() + room = msg.room() + if room: + await room.ready() + + # send contact-card + if msg.type() == MessageType.MESSAGE_TYPE_CONTACT: + # we can receive the contact-card event, and get the contact from message + contact = await msg.to_contact() + + if text == 'send card': + # find one of my friend to send to `from_contact` + contacts = await bot.Contact.find_all() + if contacts: + # send one of my friend to the talker + # !! this interface is not supported now + await from_contact.say(contacts[0]) + print('have sended') + elif msg.type() == MessageType.MESSAGE_TYPE_IMAGE: + img = await msg.to_file_box() + # save the image as local file + await img.to_file(f'./{img.name}') + # send image file to the room + if room: + await room.say(img) + + elif msg.type() == MessageType.MESSAGE_TYPE_VIDEO: + video = await msg.to_file_box() + # save the video as local file + await video.to_file(f'./{video.name}') + + # send video file to the room + if room: + await room.say(video) + + elif msg.type() == MessageType.MESSAGE_TYPE_AUDIO: + audio = await msg.to_file_box() + # save the audio file as local file + await audio.to_file(f'./{audio.name}') + # !! we can't send audio to room/contact + + print('done') + + async def on_login(self, contact: Contact): + """login event. It will be triggered every time you login""" + log.info(f'user: {contact} has login') + + async def on_scan(self, status: ScanStatus, qr_code: Optional[str] = None, + data: Optional[str] = None): + """scan event, It will be triggered when you scan the qrcode to login. + And it will not be triggered when you have logined + """ + contact = self.Contact.load(self.contact_id) + await contact.ready() + print(f'user <{contact}> scan status: {status.name} , ' + f'qr_code: {qr_code}') + + +bot: Optional[MyBot] = None + + +async def main(): + """doc""" + # pylint: disable=W0603 + global bot + bot = MyBot() + await bot.start() + + +asyncio.run(main()) diff --git a/examples/advanced/mini-program-bot.py b/examples/advanced/mini-program-bot.py new file mode 100644 index 0000000..5666d9d --- /dev/null +++ b/examples/advanced/mini-program-bot.py @@ -0,0 +1,76 @@ +"""send contact card to specific contact""" +# pylint: disable=R0801 +import asyncio +import logging +from typing import Optional, Union +import json +from dataclasses import asdict + +from wechaty_puppet import FileBox, ScanStatus # type: ignore +from wechaty_puppet import MessageType + +from wechaty import Wechaty, Contact +from wechaty.user import Message, Room + +logging.basicConfig(level=logging.INFO) +log = logging.getLogger(__name__) + + +class MyBot(Wechaty): + """ + listen wechaty event with inherited functions, which is more friendly for + oop developer + """ + def __init__(self): + super().__init__() + + async def on_message(self, msg: Message): + """ + listen for message event + """ + from_contact = msg.talker() + text = msg.text() + + room = self.Room.load('19961884194@chatroom') + await room.ready() + + if msg.type() == MessageType.MESSAGE_TYPE_MINI_PROGRAM: + mini_program = await msg.to_mini_program() + + # save the mini-program data as string + mini_program_data = asdict(mini_program.payload) + + # load the min-program + loaded_mini_program = self.MiniProgram.create_from_json( + payload_data=mini_program_data + ) + + await room.say(loaded_mini_program) + + async def on_login(self, contact: Contact): + """login event. It will be triggered every time you login""" + log.info(f'user: {contact} has login') + + async def on_scan(self, status: ScanStatus, qr_code: Optional[str] = None, + data: Optional[str] = None): + """scan event, It will be triggered when you scan the qrcode to login. + And it will not be triggered when you have logined + """ + contact = self.Contact.load(self.contact_id) + await contact.ready() + print(f'user <{contact}> scan status: {status.name} , ' + f'qr_code: {qr_code}') + + +bot: Optional[MyBot] = None + + +async def main(): + """doc""" + # pylint: disable=W0603 + global bot + bot = MyBot() + await bot.start() + + +asyncio.run(main()) diff --git a/examples/ding-dong-bot.py b/examples/ding-dong-bot.py index 228109b..de4e5aa 100755 --- a/examples/ding-dong-bot.py +++ b/examples/ding-dong-bot.py @@ -39,7 +39,7 @@ async def on_message(msg: Message): await msg.say(file_box) -async def on_scan(qrcode: str, status: int): +async def on_scan(qrcode: str, status: int, data): """ Scan Handler for the Bot """