Skip to content
Snippets Groups Projects
Commit 5fb2e649 authored by Joseph Walton-Rivers's avatar Joseph Walton-Rivers
Browse files

prototype

parents
No related branches found
No related tags found
No related merge requests found
<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>Group Allocator</title>
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.0.2/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-EVSTQN3/azprG1Anm3QDgpJLIm9Nao0Yz1ztcQTwFspd3yD65VohhpuuCOmLASjC" crossorigin="anonymous">
</head>
<body onload="start();">
<h1>Allocator</h1>
<div id="stage-name" class="stage d-none">
<form class="form" onsubmit="changeName(); return false;">
<input name="studentName" id="input-name" />
<input type="submit" />
</form>
</div>
<div id="stage-wait" class="stage d-none">
<h2>Waiting for session</h2>
</div>
<div id="stage-allocated" class="stage d-none">
<h2>Group <span id="team-id">X</span></h2>
</div>
<div class="card">
<button onclick="onStartAllocate()" />Start</button>
</div>
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.0.2/dist/js/bootstrap.bundle.min.js" integrity="sha384-MrcW6ZMFYlzcLA8Nl+NtUVF0sA7MsXsP1UyJoMp4YLEuNSfAP+JcXn/tWtIaxVXM" crossorigin="anonymous"></script>
<script src="js/client.js"></script>
</body>
</html>
'use strict';
/**
* DOM manipulation functions
*/
function setStage(stage) {
const elements = document.getElementsByClassName("stage");
for ( let i=0; i<elements.length; i++ ) {
const elm = elements[i];
if (elm.id != stage)
elm.classList.add('d-none');
else
elm.classList.remove('d-none');
}
}
function showAllocation(team) {
const label = document.getElementById("team-id");
label.textContent = team.groupID;
setStage('stage-allocated');
}
function changeName(){
const newName = document.getElementById("input-name").value;
alloc.setName( newName );
setStage( 'stage-wait' );
return false;
}
function onStartAllocate() {
alloc.forceAllocate();
}
/**
* Websocket functions
*/
let alloc = null;
class AllocatorToy {
constructor(ws) {
this.ws = ws;
ws.onopen = this.onConnect;
ws.onmessage = this.onMessage;
}
onConnect() {
setStage('stage-name');
const nameStage = document.getElementById("stage-name");
nameStage.classList.remove('d-none');
}
onMessage(evt) {
let msg = JSON.parse(evt.data);
console.log( msg );
switch ( msg.type ) {
case 'allocate':
showAllocation( msg.data );
break;
}
}
send(type, payload) {
const msg = {
'type': type,
'data': payload
};
this.ws.send( JSON.stringify( msg ) );
}
setName(name){
this.send( 'changeName', { 'name': name } );
}
forceAllocate() {
this.send( 'forceAllocate', {} );
console.log("allocation requested");
}
};
function start() {
const ws = new WebSocket('ws://localhost:8081');
alloc = new AllocatorToy( ws );
}
#! /bin/bash
pushd client
python -m http.server 8080& 1>&2 > /dev/null
popd
pushd server
npm install
npm start server.js
popd
node_server/
[[source]]
url = "https://pypi.org/simple"
verify_ssl = true
name = "pypi"
[packages]
websockets = "*"
[dev-packages]
[requires]
python_version = "3.10"
{
"_meta": {
"hash": {
"sha256": "9372c87462b01c25518e6c081b045eeeb977133e126dbd8d7f5a394e51fac0fd"
},
"pipfile-spec": 6,
"requires": {
"python_version": "3.10"
},
"sources": [
{
"name": "pypi",
"url": "https://pypi.org/simple",
"verify_ssl": true
}
]
},
"default": {
"websockets": {
"hashes": [
"sha256:038afef2a05893578d10dadbdbb5f112bd115c46347e1efe99f6a356ff062138",
"sha256:05f6e9757017270e7a92a2975e2ae88a9a582ffc4629086fd6039aa80e99cd86",
"sha256:0b66421f9f13d4df60cd48ab977ed2c2b6c9147ae1a33caf5a9f46294422fda1",
"sha256:0cd02f36d37e503aca88ab23cc0a1a0e92a263d37acf6331521eb38040dcf77b",
"sha256:0f73cb2526d6da268e86977b2c4b58f2195994e53070fe567d5487c6436047e6",
"sha256:117383d0a17a0dda349f7a8790763dde75c1508ff8e4d6e8328b898b7df48397",
"sha256:1c1f3b18c8162e3b09761d0c6a0305fd642934202541cc511ef972cb9463261e",
"sha256:1c9031e90ebfc486e9cdad532b94004ade3aa39a31d3c46c105bb0b579cd2490",
"sha256:2349fa81b6b959484bb2bda556ccb9eb70ba68987646a0f8a537a1a18319fb03",
"sha256:24b879ba7db12bb525d4e58089fcbe6a3df3ce4666523183654170e86d372cbe",
"sha256:2aa9b91347ecd0412683f28aabe27f6bad502d89bd363b76e0a3508b1596402e",
"sha256:56d48eebe9e39ce0d68701bce3b21df923aa05dcc00f9fd8300de1df31a7c07c",
"sha256:5a38a0175ae82e4a8c4bac29fc01b9ee26d7d5a614e5ee11e7813c68a7d938ce",
"sha256:5b04270b5613f245ec84bb2c6a482a9d009aefad37c0575f6cda8499125d5d5c",
"sha256:6193bbc1ee63aadeb9a4d81de0e19477401d150d506aee772d8380943f118186",
"sha256:669e54228a4d9457abafed27cbf0e2b9f401445c4dfefc12bf8e4db9751703b8",
"sha256:6a009eb551c46fd79737791c0c833fc0e5b56bcd1c3057498b262d660b92e9cd",
"sha256:71a4491cfe7a9f18ee57d41163cb6a8a3fa591e0f0564ca8b0ed86b2a30cced4",
"sha256:7b38a5c9112e3dbbe45540f7b60c5204f49b3cb501b40950d6ab34cd202ab1d0",
"sha256:7bb9d8a6beca478c7e9bdde0159bd810cc1006ad6a7cb460533bae39da692ca2",
"sha256:82bc33db6d8309dc27a3bee11f7da2288ad925fcbabc2a4bb78f7e9c56249baf",
"sha256:8351c3c86b08156337b0e4ece0e3c5ec3e01fcd14e8950996832a23c99416098",
"sha256:8beac786a388bb99a66c3be4ab0fb38273c0e3bc17f612a4e0a47c4fc8b9c045",
"sha256:97950c7c844ec6f8d292440953ae18b99e3a6a09885e09d20d5e7ecd9b914cf8",
"sha256:98f57b3120f8331cd7440dbe0e776474f5e3632fdaa474af1f6b754955a47d71",
"sha256:9ca2ca05a4c29179f06cf6727b45dba5d228da62623ec9df4184413d8aae6cb9",
"sha256:a03a25d95cc7400bd4d61a63460b5d85a7761c12075ee2f51de1ffe73aa593d3",
"sha256:a10c0c1ee02164246f90053273a42d72a3b2452a7e7486fdae781138cf7fbe2d",
"sha256:a72b92f96e5e540d5dda99ee3346e199ade8df63152fa3c737260da1730c411f",
"sha256:ac081aa0307f263d63c5ff0727935c736c8dad51ddf2dc9f5d0c4759842aefaa",
"sha256:b22bdc795e62e71118b63e14a08bacfa4f262fd2877de7e5b950f5ac16b0348f",
"sha256:b4059e2ccbe6587b6dc9a01db5fc49ead9a884faa4076eea96c5ec62cb32f42a",
"sha256:b7fe45ae43ac814beb8ca09d6995b56800676f2cfa8e23f42839dc69bba34a42",
"sha256:bef03a51f9657fb03d8da6ccd233fe96e04101a852f0ffd35f5b725b28221ff3",
"sha256:bffc65442dd35c473ca9790a3fa3ba06396102a950794f536783f4b8060af8dd",
"sha256:c21a67ab9a94bd53e10bba21912556027fea944648a09e6508415ad14e37c325",
"sha256:c67d9cacb3f6537ca21e9b224d4fd08481538e43bcac08b3d93181b0816def39",
"sha256:c6e56606842bb24e16e36ae7eb308d866b4249cf0be8f63b212f287eeb76b124",
"sha256:cb316b87cbe3c0791c2ad92a5a36bf6adc87c457654335810b25048c1daa6fd5",
"sha256:cef40a1b183dcf39d23b392e9dd1d9b07ab9c46aadf294fff1350fb79146e72b",
"sha256:cf931c33db9c87c53d009856045dd524e4a378445693382a920fa1e0eb77c36c",
"sha256:d4d110a84b63c5cfdd22485acc97b8b919aefeecd6300c0c9d551e055b9a88ea",
"sha256:d5396710f86a306cf52f87fd8ea594a0e894ba0cc5a36059eaca3a477dc332aa",
"sha256:f09f46b1ff6d09b01c7816c50bd1903cf7d02ebbdb63726132717c2fcda835d5",
"sha256:f14bd10e170abc01682a9f8b28b16e6f20acf6175945ef38db6ffe31b0c72c3f",
"sha256:f5c335dc0e7dc271ef36df3f439868b3c790775f345338c2f61a562f1074187b",
"sha256:f8296b8408ec6853b26771599990721a26403e62b9de7e50ac0a056772ac0b5e",
"sha256:fa35c5d1830d0fb7b810324e9eeab9aa92e8f273f11fdbdc0741dcded6d72b9f"
],
"index": "pypi",
"version": "==10.2"
}
},
"develop": {}
}
#! /usr/bin/env python3
from collections import namedtuple
import json
import asyncio
import random
import uuid
from websockets import serve
def allocate(students, studentsPerGroup=4):
random.shuffle( students )
groups = []
gid = 0
currGroup = []
for student in students:
currGroup.append( student )
if studentsPerGroup == len(currGroup):
groups.append( currGroup )
currGroup = []
gid += 1
# last team
if currGroup:
groups.append( currGroup )
return groups
async def changeName(client, message):
client.name = message['data']['name']
async def forceAllocate(client, message):
ids = list( clients.keys() )
groups = allocate( ids )
for (idx, group) in enumerate(groups):
for student in group:
data = {
'groupID': idx
}
await clients[ student ].send_topic( 'allocate', data )
protocol = {
'changeName': changeName,
'forceAllocate': forceAllocate
}
class Client:
def __init__(self, socket):
self.uuid = uuid.uuid4()
self.name = None
self.socket = socket
async def send_topic(self, topic, data):
msg = {
'type': 'allocate',
'data': data
}
print( msg )
await self.socket.send( json.dumps(msg) )
clients = {}
async def handleClient(websocket):
client = Client(websocket)
clients[ client.uuid ] = client
async for message in websocket:
data = json.loads( message )
msg_type = data['type']
if msg_type in protocol:
await protocol[ msg_type ]( client, data )
await websocket.send( message )
del clients[ client.uuid ]
async def main():
async with serve(handleClient, "localhost", 8081):
await asyncio.Future()
asyncio.run( main() )
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment