import asyncio
import json
import websockets
connected = [ ]
IDs = { }
async def check ( websocket ) :
await websocket . send ( json . dumps ( { " type " : " test " , " message " : " test packet from server " } ) )
async for original in websocket :
packet = json . loads ( original )
print ( packet )
if packet [ " type " ] == " user_joined " :
IDs [ websocket ] = packet [ " name " ]
websockets . broadcast ( connected , json . dumps ( { " type " : " server_message " , " message " : IDs [ websocket ] + " joined " } ) )
websockets . broadcast ( connected , json . dumps ( { " type " : " view " , " loc " : " blueland " } ) )
websockets . broadcast ( connected , json . dumps ( { " type " : " portrait " , " npc " : " pink " } ) )
websockets . broadcast ( connected , json . dumps ( { " type " : " prose " , " clear_box " : " true " , " message " : " You are in Chatland. " } ) )
websockets . broadcast ( connected , json . dumps ( { " type " : " action " , " clear_box " : " true " , " actions " : [ " \" Where am I? \" " , " Talk to Godot Head " , " Catch New Pet " , " Leave " ] } ) )
elif packet [ " type " ] == " shout " or packet [ ' type ' ] == " server_message " :
websockets . broadcast ( connected , json . dumps ( { " type " : " shout " , " name " : IDs [ websocket ] , " message " : packet [ " message " ] } ) )
websockets . broadcast ( connected , json . dumps ( { " type " : " view " , " loc " : " yellowland " } ) )
websockets . broadcast ( connected , json . dumps ( { " type " : " portrait " , " npc " : " blue " } ) )
async def handler ( websocket ) :
while True :
try :
connected . append ( websocket )
await check ( websocket )
except websockets . exceptions . ConnectionClosed :
websockets . broadcast ( connected , json . dumps ( { " type " : " server_message " , " message " : IDs [ websocket ] + " joined " } ) )
break
finally :
if websocket in connected :
connected . remove ( websocket )
async def main ( ) :
async with websockets . serve ( handler , " " , 8080 ) :
await asyncio . Future ( ) # run forever
if __name__ == " __main__ " :
asyncio . run ( main ( ) )