You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

59 lines
2.5 KiB

###############################################################################
# Copyright (C) 2023 Kostiantyn Klochko <kklochko@protonmail.com> #
# #
# This file is part of notification-client. #
# #
# notification-client is free software: you can redistribute it and/or modify #
# it under the terms of the GNU Affero General Public License as published by #
# the Free Software Foundation, either version 3 of the License, or (at your #
# option) any later version. #
# #
# notification-client is distributed in the hope that it will be useful, but #
# WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY #
# or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public #
# License for more details. #
# #
# You should have received a copy of the GNU Affero General Public License #
# along with notification-client. If not, see <https://www.gnu.org/licenses/>.#
###############################################################################
import asyncio
import struct
from notification_client.MessagePrinter import MessagePrinter
from notification_client.notitication import Notification
class Client:
BUFFER_SIZE = 1024
def __init__(self, ip: str, port: int):
self.__ip = ip
self.__port = port
async def connect(self):
reader, writer = await asyncio.open_connection(self.__ip, self.__port)
await self.handle(reader, writer)
@staticmethod
async def receive_message(reader) -> str:
size, = struct.unpack('<L', await reader.readexactly(4))
message = await reader.readexactly(size)
return message.decode('utf-8')
async def handle(self, reader, writer):
try:
while True:
title = await self.receive_message(reader)
message = await self.receive_message(reader)
MessagePrinter.print(title, message)
Notification.notify(title, message)
except asyncio.CancelledError:
print('Something went wrong')
finally:
writer.close()
await writer.wait_closed()