I am working on a buffet simulation of a buffet. So basically the client will first go through the payment. Then he should go to get his tray which is the part that does not work. After, he should go get his food.
I dont understand why the Clients are not going to the tray queue.
In fact, right-now the client is paying and then he his going directly to tale his food without taking a tray so something must be wrong in the class function but I can't figure what.
import threading
import random
import time
import concurrent.futures
import traceback
class Queue:
def __init__(self) -> None:
self.list_of_products = []
self.queue = []
self.lock = threading.Lock()
self.bill = 0
self.type_of_products = random.randrange(1, 4)
def add_client(self, client):
self.lock.acquire()
self.queue.append(client)
self.lock.release()
def remove_client(self, client):
self.lock.acquire()
self.queue.remove(client)
self.lock.release()
def check_if_client_in_queue(self, client) -> bool:
self.lock.acquire()
student_in_queue = True if client in self.queue else False
self.lock.release()
return student_in_queue
def check_if_empty(self) -> bool:
self.lock.acquire()
empty = len(self.queue) == 0
self.lock.release()
return empty
def get_first_client(self):
if not self.check_if_empty():
return self.queue.pop(0)
return None
def result_of_random_range(self):
x = self.type_of_products
return x
def paying(self):
self.lock.acquire()
if self.type_of_products == 1:
self.list_of_products.append(self.type_of_products)#i think it is not appending
self.bill = 1 * 25.90
elif self.type_of_products == 2:
self.list_of_products.append(self.type_of_products)
self.bill = 1 * 17.90
else:
self.list_of_products.append(self.type_of_products)
self.bill = 1 * 13.50
type_of_payment = random.randrange(1, 3)
if type_of_payment == 1:
print("Client has to pay", self.bill, "and he is paying in cash")
change = random.randrange(int(self.bill), round(int(self.bill) + 5)) - int(self.bill)
print("Amount to be returned", change, "€")
else:
print("Client has to pay", self.bill, "and he is paying with his credit card")
self.lock.release()
return self.bill
def tray(self):
self.lock.acquire()
random_fall = random.randrange(1,25)
if random_fall != 1:
print("Client got his Tray")
else:
print("Client dropped his tray")
time.sleep(10)
self.lock.release()
class Clients:
def __init__(self, id, queues):
self.id = id
self.queues = queues
if random.randrange(1, 3) == 1:
self.queues["clients_waiting_to_pay_manually"].add_client(self)
else:
self.queues["clients_waiting_to_pay_automatically"].add_client(self)
def __str__(self) -> str:
return f"{self.id}"
def change_queues(self) -> None:
try:
while True:
if not self.queues["clients_waiting_to_pay_manually"].check_if_client_in_queue(self) and not \
self.queues["clients_waiting_to_pay_automatically"].check_if_client_in_queue(self):
break
change_criteria = random.randrange(1, 10)
if change_criteria != 1:
time.sleep(1)
continue
print(f"Client with id {self.id} is gonna switch queue")
if self.queues["clients_waiting_to_pay_manually"].check_if_client_in_queue(self):
self.queues["clients_waiting_to_pay_manually"].remove_client(self)
self.queues["clients_waiting_to_pay_automatically"].add_client(self)
time.sleep(1)
continue
if self.queues["clients_waiting_to_pay_automatically"].check_if_client_in_queue(self):
self.queues["clients_waiting_to_pay_automatically"].remove_client(self)
self.queues["clients_waiting_to_pay_manually"].add_client(self)
time.sleep(1)
continue
except Exception:
traceback.print_exc()
class Station:
def __init__(self, id, queues):
self.id = id
self.queues = queues
def moving_station(self):
try:
while True:
if not self.queues["clients_waiting_to_pay_automatically"].check_if_empty():
client = self.queues["clients_waiting_to_pay_automatically"].get_first_client()
print(f"Cashier {self.id}: Serving the client {client} in the automatic queue")
self.queues["clients_waiting_to_pay_automatically"].paying()
print(f"Client {client} has paid and is going to another station ")
self.queues["clients_getting_main_food"].add_client(client)
print(f"Client {client} is getting his food ")
time.sleep(2)
elif not self.queues["clients_waiting_to_pay_manually"].check_if_empty():
client = self.queues["clients_waiting_to_pay_manually"].get_first_client()
print(f"Cashier {self.id}: Serving the client {client} in the manual queue")
self.queues["clients_waiting_to_pay_manually"].paying()
print(f"Client {client} has paid and is going to another station ")
self.queues["clients_getting_main_food"].add_client(client)
print(f"Client {client} is getting his food ")
time.sleep(2)
else:
break
except Exception:
traceback.print_exc()
class Trays:
def __init__(self,queues) -> None:
self.queues = queues
def giving_trays(self):
try:
while True:
if self.queues["clients_waiting_for_tray"].check_if_empty():
print(f"There is no more clients waiting for a tray")
break
elif not self.queues["clients_waiting_for_tray"].check_if_empty():
client = self.queues["clients_waiting_for_tray"].get_first_client()
print(f"{client} got his tray")
print(f"Client {client} just got his tray")
time.sleep(2)
else:
break
except Exception as e:
traceback.print_exc()
class Main_food:
def __init__(self,id,queues):
self.id = id
self.queues = queues
def getting_food(self):
pasta_menu = ["Carbonara ", "Pesto", "Basilico", "Bolognese", "Truffle", "Chicken Alfredo"]
protein_menu = ["Beef","Pork","Fish","chicken","Beyond Meat","turkey"]
pasta_stock = [2,1,4,5,6,3]
protein_stock = [2,1,4,5,6,3]
try:
if not self.queues["clients_getting_main_food"].check_if_empty():
client_getting_served = self.queues["clients_getting_main_food"].get_first_client()
if self.queues["clients_waiting_to_pay_automatically"].result_of_random_range() == 1:
self.queues["clients_getting_menu_1"].add_client(client_getting_served)
elif self.queues["clients_waiting_to_pay_manually"].result_of_random_range() == 1:
self.queues["clients_getting_menu_1"].add_client(client_getting_served)
if self.queues["clients_waiting_to_pay_automatically"].result_of_random_range() == 2:
self.queues["clients_getting_menu_2"].add_client(client_getting_served)
elif self.queues["clients_waiting_to_pay_manually"].result_of_random_range() == 2:
self.queues["clients_getting_menu_2"].add_client(client_getting_served)
elif self.queues["clients_waiting_to_pay_manually"].result_of_random_range() == 3:
self.queues["clients_getting_menu_3"].add_client(client_getting_served)
else:
self.queues["clients_getting_menu_3"].add_client(client_getting_served)
x = random.randrange(0,6)
y = random.randrange(0,6)
stock = pasta_stock[x]
stock1 = protein_stock[y]
if not self.queues["clients_getting_menu_1"].check_if_empty():
client_being_served_1 = self.queues["clients_getting_menu_1"].get_first_client()
if stock != 0:
pasta_stock[x] = pasta_stock[x]-1
if stock1 != 0:
protein_stock[y] = protein_stock[y]-1
print(f"Client {client_being_served_1} is getting Pasta : {pasta_menu[x]} and Protein : {protein_menu[y]}")
print(f"pasta {pasta_stock[x]} protein {protein_stock[y]} ")
self.queues["clients_getting_desert"].add_client(client_being_served_1)
if not self.queues["clients_getting_menu_2"].check_if_empty():
client_being_served_2 = self.queues["clients_getting_menu_2"].get_first_client()
if stock != 0:
pasta_stock[x] = pasta_stock[x]-1
print(f"Client {client_being_served_2} is getting Pasta :{pasta_menu[x]}")
print(f"pasta2 {pasta_stock[x]} ")
self.queues["clients_getting_desert"].add_client(client_being_served_2)
elif not self.queues["clients_getting_menu_3"].check_if_empty():
client_being_served_3 = self.queues["clients_getting_menu_3"].get_first_client()
if stock1 != 0:
protein_stock[y] = protein_stock[y]-1
print(f"Client {client_being_served_3} is getting Protein :{protein_menu[y]}")
print(f"protein3 {protein_stock[y]} ")
self.queues["clients_getting_desert"].add_client(client_being_served_3)
except Exception as e:
traceback.print_exc()
queues ={
"clients_waiting_to_pay_manually": Queue(),
"clients_waiting_to_pay_automatically": Queue(),
"clients_waiting_for_tray": Queue(),
"clients_getting_main_food": Queue(),
"clients_not_getting_main_food": Queue(),
"clients_getting_menu_1": Queue(),
"clients_getting_menu_2": Queue(),
"clients_getting_menu_3": Queue(),
"clients_getting_desert": Queue()
}
number_of_cashiers = 3
number_of_clients = 10
clients = [Clients(id, queues) for id in range(number_of_clients)]
stations = [Station(id, queues) for id in range(number_of_clients)]
trays = [Trays(queues) for id in range(number_of_clients)]
foods = [Main_food(id, queues) for id in range(number_of_clients)]
with concurrent.futures.ThreadPoolExecutor(max_workers=number_of_clients) as executor:
for client in clients:
executor.submit(client.change_queues)
with concurrent.futures.ThreadPoolExecutor(max_workers=number_of_clients) as executor:
for station in stations:
executor.submit(station.moving_station)
with concurrent.futures.ThreadPoolExecutor(max_workers=number_of_clients) as executor:
for tray in trays:
executor.submit(tray.giving_trays)
with concurrent.futures.ThreadPoolExecutor(max_workers=number_of_clients) as executor:
for food in foods:
executor.submit(food.getting_food)
Related
I've adjusted the main file and added a prefix "?" to my commands
import discord
from discord.ext import commands
import os
import asyncio
client = commands.Bot(command_prefix="?", intents = discord.Intents.all())
async def load():
for filename in os.listdir("./cogs"):
if filename.endswith(".py"):
await client.load_extension(f"cogs.{filename[:-3]}")
async def main():
async with client:
await load()
await client.start(TOKEN)
asyncio.run(main())
and added a simple ping command to test if the bot was working in discord. unfortunately all the commands except for ping does not work
import discord
from discord.ext import commands
from pymongo import MongoClient
bot_channel = BOTCHANNELID
talk_channels = [TALKCHANNELID]
level = ["test1", "test2", "test3"]
levelnum = [2,4,6]
cluster = MongoClient("MONGODBCODE")
levelling = cluster["NAME"]["NAME2"]
class levelsys(commands.Cog):
def __init__(self,client):
self.client = client
#commands.Cog.listener()
async def on_ready(self):
print("Ready!")
#commands.Cog.listener()
async def on_message(self, message):
if message.channel.id in talk_channels:
stats = levelling.find_one({"id" : message.author.id})
if not message.author.bot:
if stats is None:
newuser = {"id" : message.author.id, "xp" : 1}
levelling.insert_one(newuser)
else:
xp = stats["xp"] + 5
levelling.update_one({"id":message.author.id}, {"$set":{"xp":xp}})
lvl = 0
while True:
if xp < ((50*(lvl**2))+(50*(lvl-1))):
break
lvl += 1
xp -= ((50*((lvl-1)**2))+(50*(lvl-1)))
if xp == 0:
await message.channel.send(f"gz {message.author.mention} ! you lvled up to **level: {lvl}**")
for i in range(len(level)):
if lvl == levelnum[i]:
await message.author.add_roles(discord.utils.get(message.author.guild.roles, name=level[i]))
embed = discord.Embed(description=f"{message.author.mention} you have gotten role **{level[i]}**")
embed.set_thumbnail(url=message.author.avatar_url)
await message.channel.send(embed=embed)
#commands.command()
async def rank(self, ctx):
if ctx.channel.id == bot_channel:
stats = levelling.find_one({"id" : ctx.author.id})
if stats is None:
embed = discord.Embed(description="you haven't been studying lil bro")
await ctx.channel.send(embed=embed)
else:
xp = stats["xp"]
lvl = 0
rank = 0
while True:
if xp < ((50*(lvl**2))+(50*lvl)):
break
lvl += 1
xp -= ((50*((lvl-1)**2))+(50*(lvl-1)))
boxes = int((xp/(200*((1/2) * lvl)))*20)
rankings = levelling.find().sort("xp",-1)
for x in rankings:
rank += 1
if stats["id"] == x["id"]:
break
embed = discord.Embed(title="{}'s level stats".format(ctx.author.name))
embed.add_field(name="Name", value=ctx.author.mention, inline=True)
embed.add_field(name="XP", value=f"{xp}/{int(200*((1/2)*lvl))}", inline=True)
embed.add_field(name="Rank", value=f"{rank}/{ctx.guild.member_count}", inline=True)
embed.add_field(name="Progress Bar [lvl]", value=boxes * ":blue_square:" + (20-boxes) * ":white_large_squares:", inline = False)
embed.add_field(name='Level', value=f'{lvl}', inline=True)
embed.set_thumbnail(url=ctx.author.avatar_url)
await ctx.channel.send(embed=embed)
#commands.command()
async def dashboard(self, ctx):
if (ctx.channel.id == bot_channel):
rankings = levelling.find().sort("xp",-1)
i = 1
embed = discord.Embed(title="Rankings:")
for x in rankings:
try:
temp = ctx.guild.get_member(x["id"])
tempxp = x["xp"]
embed.add_field(name=f"{i}: {temp.name}", value=f"Total XP: {tempxp}", inline=False)
i += 1
except:
pass
if i == 11:
break
await ctx.channel.send(embed=embed)
#commands.command()
async def ping(self, ctx):
bot_latency = round(self.client.latency * 1000)
await ctx.send(f"Your ping is {bot_latency} ms !.")
async def setup(client):
await client.add_cog(levelsys(client))
I'm not too sure how I would go about fixing all the other commands to get them working. All help is much appreciated !
im running a chat app on my computer and i tried to send a message and this ERROR accured. it suppose to send a " will joind the chat" and another message " connected to server" after that i should send my message to the group and it didnt worked.
any ideas?
import kivy
from kivy.app import App
from kivy.uix.boxlayout import BoxLayout
import socket
import threading
kivy.require("1.9.0")
client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
class MyRoot(BoxLayout):
def __init__(self):
super(MyRoot, self).__init__()
def send_message(self):
client.send(f"{self.nickname_text.text}: {self.message_text.text}".encode('utf-8'))
def connect_to_server(self):
if self.nickname_text != "":
client.connect((self.ip_text.text, 9999))
message = client.recv(1024).decode('utf-8')
if message == "NICK":
client.send(self.nickname_text.text.encode('utf-8'))
self.send_btn.disabled = False
self.message_text.disabled = False
self.connect_btn.disabled = True
self.ip_text.disabled = True
self.make_invisible(self.connection_grid)
self.make_invisible(self.connect_btn)
thread = threading.Thread(target=self.receive)
thread.start()
def make_invisible(self, widget):
widget.visible = False
widget.size_hint_x = None
widget.size_hint_y = None
widget.height = 0
widget.width = 0
widget.text = ""
widget.opacity = 0
def receive(self):
stop = False
while not stop:
try:
message = client.recv(1024).decode('utf-8')
self.chat_text.text += message + "\n"
except:
print("ERROR")
client.close()
stop = True
class TraboChat(App):
def build(self):
return MyRoot()
trabo_chat = TraboChat()
trabo_chat.run()
serve.py:
import socket
import threading
HOST = socket.gethostbyname(socket.gethostname())
PORT = 9999
server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server.bind((HOST, PORT))
server.listen()
clients = []
nicknames = []
def broadcast(message):
for client in clients:
client.send(message)
def handle_connection(client):
stop = False
while not stop:
try:
message = client.recv(1024)
broadcast(message)
except:
index = clients.index(client)
clients.remove(client)
nickname = nicknames[index]
nicknames.remove(nickname)
broadcast(f"{nickname} left the chat!".encode('utf-8'))
stop = True
def main():
print("server is running..")
while True:
client, addr = server.accept()
print(f"connected to {addr}")
client.send("NICK".encode('utf-8'))
nickname = client.recv(1024).decode('utf-8')
nicknames.append(nickname)
clients.append(client)
print(f"Nickname is {nickname}")
broadcast(f"{nickname} join the chat!")
client.send("You are now connected".encode('utf-8'))
thread = threading.Thread(target=handle_connection, args=(client,))
if name == 'main':
main()
I want to get path of the file dropped on QLabel. So I code like this, but label doesn't accept the file. What is the problem..?
Here is my code. So long code sorry and thank you!
import random
import sys
import pygame
import time
from PyQt5.QtGui import QPixmap
from PyQt5.QtCore import Qt, QTimer
from PyQt5.QtWidgets import QWidget, QLabel, QApplication, QDesktopWidget
class Example(QWidget):
size=100
imgNum=0
frameCount=4
isXmin = False
isXmax = False
isYmin = False
isYmax = False
isLeft= True
def __init__(self):
super().__init__()
self.initUI()
def initUI(self):
sizeObject = QDesktopWidget().screenGeometry()
# print(" Screen size : " + str(sizeObject.height()) + "x" + str(sizeObject.width()))
self.xMax=sizeObject.width()-10
self.yMax=sizeObject.height()-10
print(self.xMax)
print(self.yMax)
self.setWindowFlags(Qt.FramelessWindowHint)
self.setAttribute(Qt.WA_TranslucentBackground)
self.setStyleSheet("background-color:transparent;")
self.setGeometry(100, 100, 100, 100)
self.setWindowFlags(Qt.SplashScreen | Qt.WindowStaysOnTopHint)
self.setAcceptDrops(True)
self.label=QLabel(self)
self.label.setAcceptDrops(True)
self.pixmaps=[QPixmap('left.png'),QPixmap('stand.png'),QPixmap('right.png'),QPixmap('stand.png'),QPixmap('leftR.png'),QPixmap('standR.png'),QPixmap('rightR.png'),QPixmap('standR.png')]
for x in range(len(self.pixmaps)):
self.pixmaps[x]=self.pixmaps[x].scaled(self.size,self.size,Qt.KeepAspectRatio)
self.resize(self.pixmaps[2].width(),self.pixmaps[2].height())
self.label.setPixmap(self.pixmaps[len(self.pixmaps)-1])
self.changeTimer=QTimer(self)
self.changeTimer.timeout.connect(self.changeFoot)
self.moveTimer=QTimer(self)
self.moveTimer.timeout.connect(self.moving)
self.setAcceptDrops(True)
pygame.init()
pygame.mixer.music.load('hoi_imtemmie.mp3')
pygame.mixer.music.play()
self.show()
def dragEnterEvent(self, event):
if event.mimeData().hasUrls:
event.accept()
else:
event.ingore()
def dropEvent(self, event):
self.path=event.mimeData.urls()
def moving(self):
if self.distance == 0:
print(self.distance)
print(self.x(),"x",self.y())
self.label.setPixmap(self.pixmaps[1])
self.moveTimer.stop()
self.changeTimer.stop()
time.sleep(3)
self.setMovement()
return 0
else:
self.move(self.x()+self.direct[0],self.y()+self.direct[1])
self.distance-=1
if self.x()<=-10 :
self.distance=0
print("xm")
self.isXmin = True
if self.y()<=-10 :
self.distance=0
print("ym")
self.isYmin = True
if self.x()>=self.xMax:
self.distance=0
print("xM")
self.isXmax=True
if self.y()>=self.yMax :
self.distance=0
print("yM")
self.isYmax=True
def setMovement(self):
self.direct=[0,0]
while(self.direct[0]==0 and self.direct[1]==0):
self.direct=[random.randint(-1,1),random.randint(-1,1)]
if self.isXmax:
self.direct[0]=-1
if self.isXmin:
self.direct[0]=1
if self.isYmin:
self.direct[1]=1
if self.isYmax:
self.direct[1]=-1
if self.direct[0]== -1:
self.isLeft=True
self.imgNum=0
elif self.direct[0]== 1:
self.isLeft=False
self.imgNum=4
self.isXmax = False
self.isXmin = False
self.isYmin = False
self.isYmax = False
# if direct[0]*direct[1]==0 : self.delta = QPoint(dX*direct[0],dY*direct[1])
# else: self.delta=QPoint(direct[0]*(dX**(1/2)),direct[1]*(dY**1/2))
self.distance=random.randint(200,400)
self.changeTimer.start(300)
self.moveTimer.start(30)
def changeFoot(self):
self.label.setPixmap(self.pixmaps[self.imgNum])
if self.isLeft:
if self.imgNum<self.frameCount-1:
self.imgNum+=1
else :
self.imgNum=0
else:
if self.imgNum<2*self.frameCount-1:
self.imgNum+=1
else :
self.imgNum=self.frameCount
def mousePressEvent(self, QMouseEvent):
self.setMovement()
pygame.mixer.music.load('hoi_imtemmie.mp3')
pygame.mixer.music.play()
def keyPressEvent(self, QKeyEvent):
if QKeyEvent.key() == Qt.Key_Escape:
sys.exit()
# if QKeyEvent.key() == Qt.Key_G:
if __name__ == '__main__':
app = QApplication(sys.argv)
ex = Example()
sys.exit(app.exec_())
i set AcceptDrops(True)
self.setAcceptDrops(True)
and code about get filepath ▼
def dragEnterEvent(self, event):
if event.mimeData().hasUrls:
event.accept()
else:
event.ingore()
def dropEvent(self, event):
self.path=event.mimeData.urls()
Try to loop through event.mimeData().urls()
for url in event.mimeData().urls():
self.path = url.toLocalFile()
I have this piece of code for server to handle clients. it properly receive data but when i want to send received data to clients nothing happens.
server
import socket
from _thread import *
class GameServer:
def __init__(self):
# Game parameters
board = [None] * 9
turn = 1
# TCP parameters specifying
self.tcp_ip = socket.gethostname()
self.tcp_port = 9999
self.buffer_size = 2048
self.s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
try:
self.s.bind((self.tcp_ip, self.tcp_port))
except:
print("socket error, Please try again! ")
self.s.listen(5)
print('Waiting for a connection...')
def messaging(self, conn):
while True:
data = conn.recv(self.buffer_size)
if not data:
break
print("This data from client:", data)
conn.send(data)
def thread_run(self):
while True:
conn, addr = self.s.accept()
print('connected to: ' + addr[0] + " : " + str(addr[1]))
start_new_thread(self.messaging, (conn,))
def main():
gameserver = GameServer()
gameserver.thread_run()
if __name__ == '__main__':
main()
'
I want to if data received completely send to clients by retrieve the address of sender and send it to other clients by means of conn.send() but seems there is no way to do this with 'send()' method.
The piece of client side code
'
def receive_parser(self):
global turn
rcv_data = self.s.recv(4096)
rcv_data.decode()
if rcv_data[:2] == 'c2':
message = rcv_data[2:]
if message[:3] == 'trn':
temp = message[3]
if temp == 2:
turn = -1
elif temp ==1:
turn = 1
elif message[:3] == 'num':
self.set_text(message[3])
elif message[:3] == 'txt':
self.plainTextEdit_4.appendPlainText('client1: ' + message[3:])
else:
print(rcv_data)
'
the receiver method does not receive any data.
I modified your code a little(as I have python 2.7) and conn.send() seems to work fine. You can also try conn.sendall(). Here is the code I ran:
Server code:
import socket
from thread import *
class GameServer:
def __init__(self):
# Game parameters
board = [None] * 9
turn = 1
# TCP parameters specifying
self.tcp_ip = "127.0.0.1"#socket.gethostname()
self.tcp_port = 9999
self.buffer_size = 2048
self.s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
try:
self.s.bind((self.tcp_ip, self.tcp_port))
except:
print("socket error, Please try again! ")
self.s.listen(5)
print('Waiting for a connection...')
def messaging(self, conn):
while True:
data = conn.recv(self.buffer_size)
if not data:
break
print("This data from client:", data)
conn.send(data)
def thread_run(self):
while True:
conn, addr = self.s.accept()
print('connected to: ' + addr[0] + " : " + str(addr[1]))
start_new_thread(self.messaging, (conn,))
def main():
gameserver = GameServer()
gameserver.thread_run()
main()
Client code:
import socket
s=socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect(("127.0.0.1", 9999))
def receive_parser():
#global turn
s.sendall("hello world")
rcv_data = s.recv(4096)
# rcv_data.decode()
# if rcv_data[:2] == 'c2':
# message = rcv_data[2:]
# if message[:3] == 'trn':
# temp = message[3]
# if temp == 2:
# turn = -1
# elif temp ==1:
# turn = 1
# elif message[:3] == 'num':
# self.set_text(message[3])
# elif message[:3] == 'txt':
# self.plainTextEdit_4.appendPlainText('client1: ' + message[3:])
# else:
print(rcv_data)
receive_parser()
i am losing messages in my tornado chat and i do not known how to detect when the message wasn't sent and to send the message again
there is any way to detect when the conexion get lost? and when the conexión restart send the message
this is my code
def get(self):
try:
json.dumps(MessageMixin.cache)
except KeyError:
raise tornado.web.HTTPError(404)
class MessageMixin(object):
waiters = {}
cache = {}
cache_size = 200
def wait_for_messages(self,cursor=None):
t = self.section_slug
waiters = self.waiters.setdefault(t, [])
result_future = Future()
waiters.append(result_future)
return result_future
def cancel_wait(self, future):
t = self.section_slug
waiters = self.waiters.setdefault(t, [])
waiters.remove(future)
# Set an empty result to unblock any coroutines waiting.
future.set_result([])
def new_messages(self, message):
t = self.section_slug
#cache = self.cache.setdefault(t, [])
#print t
#print self.waiters.setdefault(t, [])
waiters = self.waiters.setdefault(t, [])
for future in waiters:
try:
if message is not None:
future.set_result(message)
except Exception:
logging.error("Error in waiter callback", exc_info=True)
waiters = []
#self.cache.extend(message)
#if len(self.cache) > self.cache_size:
#self.cache = self.cache[-self.cache_size:]
class MessageNewHandler(MainHandler, MessageMixin):
def post(self, section_slug):
self.section_slug = section_slug
post = self.get_argument("html")
idThread = self.get_argument("idThread")
isOpPost = self.get_argument("isOpPost")
arg_not = self.get_argument("arg")
type_not = self.get_argument("type")
redirect_to = self.get_argument("next", None)
message= {"posts": [post],"idThread": idThread,"isOpPost": isOpPost,
"type": type_not,"arg_not": arg_not}
if redirect_to:
self.redirect(redirect_to)
else:
self.write(post)
self.new_messages(message)
class MessageUpdatesHandler(MainHandler, MessageMixin):
#gen.coroutine
def post(self, section_slug):
self.section_slug = section_slug
try:
self.future = self.wait_for_messages(cursor=self.get_argument("cursor", None))
data = yield self.future
if self.request.connection.stream.closed():
return
self.write(data)
except Exception:
raise tornado.web.HTTPError(404)
def on_connection_close(self):
self.cancel_wait(self.future)
class Application(tornado.web.Application):
def __init__(self):
handlers = [
(r"/api/1\.0/stream/(\w+)", MessageUpdatesHandler),
(r"/api/1\.0/streamp/(\w+)", MessageNewHandler)
]
tornado.web.Application.__init__(self, handlers)
def main():
tornado.options.parse_command_line()
app = Application()
port = int(os.environ.get("PORT", 5000))
app.listen(port)
tornado.ioloop.IOLoop.instance().start()
if __name__ == "__main__":
main()
In the original chatdemo, this is what the cursor parameter to wait_for_messages is for: the browser tells you the last message it got, so you can send it every message since then. You need to buffer messages and potentially re-send them in wait_for_messages. The code you've quoted here will only send messages to those clients that are connected at the time the message came in (and remember that in long-polling, sending a message puts the client out of the "waiting" state for the duration of the network round-trip, so even when things are working normally clients will constantly enter and leave the waiting state)