Advertisement
Guest User

Untitled

a guest
Sep 16th, 2019
118
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 5.77 KB | None | 0 0
  1. # -*- coding: utf-8 -*-
  2. from tkinter import *
  3. import pika
  4. import json
  5. import config
  6. import multiprocessing
  7.  
  8. """Implement an application using RabbitMQ"""
  9.  
  10.  
  11. class Chat(object):
  12.     """Base settings"""
  13.  
  14.     def __init__(self):
  15.         """Create base variable and RabbitMQ connection"""
  16.  
  17.         # load config
  18.         cfg = config.Config()
  19.         self.cfg = cfg.get()
  20.  
  21.         # GUI settings
  22.         self.tk = Tk()
  23.         self.sender1_text = StringVar()
  24.         self.sender1_text.set('')
  25.         self.sender2_text = StringVar()
  26.         self.sender2_text.set('')
  27.         self.sender1_name = StringVar()
  28.         self.sender1_name.set('Serge')
  29.         self.sender2_name = StringVar()
  30.         self.sender2_name.set('Mikhail')
  31.         self.tk.title('My test chat')
  32.         self.tk.geometry('1295x400')
  33.  
  34.         self.sender1_log = Text(self.tk)
  35.         self.sender2_log = Text(self.tk)
  36.  
  37.         # create connection RabbitMQ
  38.         self.rabbit_connection = pika.BlockingConnection(pika.ConnectionParameters(host=self.cfg['rabbitmq']['host']))
  39.         self.trace_log('RabbitMQ connection to "{}"', self.cfg['rabbitmq']['host'])
  40.         self.consumer_process = multiprocessing.Process(target=self.start_consuming)
  41.  
  42.         self.rabbit_channel = self.rabbit_connection.channel()
  43.         self.rabbit_channel.queue_declare(queue=self.cfg['rabbitmq']['queue'], durable=True)
  44.         self.trace_log('RabbitMQ declare queue "{}"', self.cfg['rabbitmq']['queue'])
  45.  
  46.     def trace_log(self, message: str, data='', ms_type='info'):
  47.         """Function for trace debug info to console"""
  48.         if self.cfg['debug'] > 0:
  49.             ms_prefix = '[*]' if ms_type == 'info' else '[!]'
  50.             print(ms_prefix + ' ' + message.format(data))
  51.  
  52.     def create_window(self):
  53.         """Create GUI"""
  54.         sender1_nick = Entry(self.tk, textvariable=self.sender1_name)
  55.         sender2_nick = Entry(self.tk, textvariable=self.sender2_name)
  56.         sender1_msg = Entry(self.tk, textvariable=self.sender1_text)
  57.         sender2_msg = Entry(self.tk, textvariable=self.sender2_text)
  58.  
  59.         def send_proc1():
  60.             self.send_message(1, self.sender1_text.get())
  61.             self.sender1_text.set('')
  62.  
  63.         def send_proc2():
  64.             self.send_message(2, self.sender2_text.get())
  65.             self.sender2_text.set('')
  66.  
  67.         sender1_send = Button(self.tk, text='send', width=25, height=5, bg='white', fg='black', font='arial 14',
  68.                               command=send_proc1)
  69.         sender2_send = Button(self.tk, text='send', width=25, height=5, bg='white', fg='black', font='arial 14',
  70.                               command=send_proc2)
  71.  
  72.         # user 1
  73.         sender1_nick.grid(row=0, column=0, sticky='ew')
  74.         sender1_msg.grid(row=1, column=0, sticky='ew')
  75.         sender1_send.grid(row=2, column=0, sticky='ew')
  76.         self.sender1_log.grid(row=3, column=0, sticky='ew')
  77.  
  78.         # user 2
  79.         sender2_nick.grid(row=0, column=1, sticky='ew')
  80.         sender2_msg.grid(row=1, column=1, sticky='ew')
  81.         sender2_send.grid(row=2, column=1, sticky='ew')
  82.         self.sender2_log.grid(row=3, column=1, sticky='ew')
  83.  
  84.         self.trace_log('Create GUI')
  85.         self.tk.mainloop()
  86.  
  87.         # kill consumer process
  88.         self.consumer_process.terminate()
  89.         self.rabbit_channel.stop_consuming()
  90.         self.rabbit_connection.close()
  91.  
  92.         self.trace_log('Drop GUI')
  93.  
  94.     def send_message(self, user_number: int, message: str):
  95.         """Send message to RabbitMQ"""
  96.         if message.__len__() > 0:
  97.             self.publish_message(user_number, message)
  98.  
  99.     def publish_message(self, user: int, message: str):
  100.         """Publish RabbitMQ message"""
  101.         message = json.dumps({'user_from': user, 'user_to': 2 if user == 1 else 1, 'message': message})
  102.         self.print_log(message)
  103.  
  104.         self.rabbit_channel.basic_publish(exchange=self.cfg['rabbitmq']['exchange'],
  105.                                           routing_key=self.cfg['rabbitmq']['routing_key'],
  106.                                           body=message,
  107.                                           properties=pika.BasicProperties(
  108.                                               delivery_mode=self.cfg['rabbitmq']['delivery_mod'])
  109.                                           )
  110.  
  111.         self.trace_log('RabbitMQ send message: {}', message)
  112.  
  113.     def start_consuming(self):
  114.         if not self.rabbit_connection.is_closed:
  115.             self.rabbit_channel.basic_qos(prefetch_count=self.cfg['rabbitmq']['prefetch_count'])
  116.             self.rabbit_channel.basic_consume(self.callback, queue=self.cfg['rabbitmq']['queue'])
  117.             self.trace_log('RabbitMQ start consuming')
  118.             self.rabbit_channel.start_consuming()
  119.  
  120.     def callback(self, ch, method, properties, body):
  121.         ch.basic_ack(delivery_tag=method.delivery_tag)
  122.         body = bytes.decode(body)
  123.         self.trace_log('RabbitMQ consume message "{}"', body)
  124.  
  125.     def print_log(self, message: str):
  126.         message_decode = json.loads(message)
  127.         log_from = getattr(self, 'sender' + str(message_decode['user_from']) + '_log')
  128.         sender_name = getattr(self, 'sender' + str(message_decode['user_from']) + '_name')
  129.         log_to = getattr(self, 'sender' + str(message_decode['user_to']) + '_log')
  130.         log_from.see(END)
  131.         log_to.see(END)
  132.  
  133.         try:
  134.             log_from.insert(END, 'You: ' + message_decode['message'] + '\n')
  135.             log_to.insert(END, sender_name.get() + ': ' + message_decode['message'] + '\n')
  136.  
  137.         except:
  138.             self.tk.after(1)
  139.             return
  140.  
  141.         self.tk.after(1)
  142.         return
  143.  
  144.     def start(self):
  145.         """Start chat"""
  146.         self.consumer_process.start()
  147.         self.create_window()
  148.  
  149.  
  150. if __name__ == '__main__':
  151.     chat = Chat()
  152.     chat.start()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement