Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- # -*- coding: utf-8 -*-
- from tkinter import *
- import pika
- import json
- import config
- import multiprocessing
- """Implement an application using RabbitMQ"""
- class Chat(object):
- """Base settings"""
- def __init__(self):
- """Create base variable and RabbitMQ connection"""
- # load config
- cfg = config.Config()
- self.cfg = cfg.get()
- # GUI settings
- self.tk = Tk()
- self.sender1_text = StringVar()
- self.sender1_text.set('')
- self.sender2_text = StringVar()
- self.sender2_text.set('')
- self.sender1_name = StringVar()
- self.sender1_name.set('Serge')
- self.sender2_name = StringVar()
- self.sender2_name.set('Mikhail')
- self.tk.title('My test chat')
- self.tk.geometry('1295x400')
- self.sender1_log = Text(self.tk)
- self.sender2_log = Text(self.tk)
- # create connection RabbitMQ
- self.rabbit_connection = pika.BlockingConnection(pika.ConnectionParameters(host=self.cfg['rabbitmq']['host']))
- self.trace_log('RabbitMQ connection to "{}"', self.cfg['rabbitmq']['host'])
- self.consumer_process = multiprocessing.Process(target=self.start_consuming)
- self.rabbit_channel = self.rabbit_connection.channel()
- self.rabbit_channel.queue_declare(queue=self.cfg['rabbitmq']['queue'], durable=True)
- self.trace_log('RabbitMQ declare queue "{}"', self.cfg['rabbitmq']['queue'])
- def trace_log(self, message: str, data='', ms_type='info'):
- """Function for trace debug info to console"""
- if self.cfg['debug'] > 0:
- ms_prefix = '[*]' if ms_type == 'info' else '[!]'
- print(ms_prefix + ' ' + message.format(data))
- def create_window(self):
- """Create GUI"""
- sender1_nick = Entry(self.tk, textvariable=self.sender1_name)
- sender2_nick = Entry(self.tk, textvariable=self.sender2_name)
- sender1_msg = Entry(self.tk, textvariable=self.sender1_text)
- sender2_msg = Entry(self.tk, textvariable=self.sender2_text)
- def send_proc1():
- self.send_message(1, self.sender1_text.get())
- self.sender1_text.set('')
- def send_proc2():
- self.send_message(2, self.sender2_text.get())
- self.sender2_text.set('')
- sender1_send = Button(self.tk, text='send', width=25, height=5, bg='white', fg='black', font='arial 14',
- command=send_proc1)
- sender2_send = Button(self.tk, text='send', width=25, height=5, bg='white', fg='black', font='arial 14',
- command=send_proc2)
- # user 1
- sender1_nick.grid(row=0, column=0, sticky='ew')
- sender1_msg.grid(row=1, column=0, sticky='ew')
- sender1_send.grid(row=2, column=0, sticky='ew')
- self.sender1_log.grid(row=3, column=0, sticky='ew')
- # user 2
- sender2_nick.grid(row=0, column=1, sticky='ew')
- sender2_msg.grid(row=1, column=1, sticky='ew')
- sender2_send.grid(row=2, column=1, sticky='ew')
- self.sender2_log.grid(row=3, column=1, sticky='ew')
- self.trace_log('Create GUI')
- self.tk.mainloop()
- # kill consumer process
- self.consumer_process.terminate()
- self.rabbit_channel.stop_consuming()
- self.rabbit_connection.close()
- self.trace_log('Drop GUI')
- def send_message(self, user_number: int, message: str):
- """Send message to RabbitMQ"""
- if message.__len__() > 0:
- self.publish_message(user_number, message)
- def publish_message(self, user: int, message: str):
- """Publish RabbitMQ message"""
- message = json.dumps({'user_from': user, 'user_to': 2 if user == 1 else 1, 'message': message})
- self.print_log(message)
- self.rabbit_channel.basic_publish(exchange=self.cfg['rabbitmq']['exchange'],
- routing_key=self.cfg['rabbitmq']['routing_key'],
- body=message,
- properties=pika.BasicProperties(
- delivery_mode=self.cfg['rabbitmq']['delivery_mod'])
- )
- self.trace_log('RabbitMQ send message: {}', message)
- def start_consuming(self):
- if not self.rabbit_connection.is_closed:
- self.rabbit_channel.basic_qos(prefetch_count=self.cfg['rabbitmq']['prefetch_count'])
- self.rabbit_channel.basic_consume(self.callback, queue=self.cfg['rabbitmq']['queue'])
- self.trace_log('RabbitMQ start consuming')
- self.rabbit_channel.start_consuming()
- def callback(self, ch, method, properties, body):
- ch.basic_ack(delivery_tag=method.delivery_tag)
- body = bytes.decode(body)
- self.trace_log('RabbitMQ consume message "{}"', body)
- def print_log(self, message: str):
- message_decode = json.loads(message)
- log_from = getattr(self, 'sender' + str(message_decode['user_from']) + '_log')
- sender_name = getattr(self, 'sender' + str(message_decode['user_from']) + '_name')
- log_to = getattr(self, 'sender' + str(message_decode['user_to']) + '_log')
- log_from.see(END)
- log_to.see(END)
- try:
- log_from.insert(END, 'You: ' + message_decode['message'] + '\n')
- log_to.insert(END, sender_name.get() + ': ' + message_decode['message'] + '\n')
- except:
- self.tk.after(1)
- return
- self.tk.after(1)
- return
- def start(self):
- """Start chat"""
- self.consumer_process.start()
- self.create_window()
- if __name__ == '__main__':
- chat = Chat()
- chat.start()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement