summaryrefslogtreecommitdiff
path: root/static/chat.js
blob: 47cf6d37db2bfd1affe2aeb24fe9862d97659879 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
function randomColor() {
	var h = Math.floor(Math.random() * 360);
	var s = Math.floor((Math.random() * 0.5 + 0.5)*100);
	var l = Math.floor((Math.random() * 0.4 + 0.3)*100);
	return "hsl("+h+", "+s+"%, "+l+"%)";
}

function askTryAgain(reason, ws_url) {
	if(confirm("Could not join chat (Reason: "+ reason +"). Try again?")) {
		window.setTimeout(RunChat, 1, ws_url); // We use a timeout, so we don't accidentally fill up the call stack.
	}
}

var buddyColors = {};

function addBuddy(nick) {
	var found = false;
	$("#buddies li").each(function(index) {
		if($(this).text() == nick) {
			found = true;
		}
	});
	if(!found) {
		var col = randomColor();
		buddyColors[nick] = col;
		$("#buddies").append($("<li/>").css("color", col).text(nick));
	}
}

function removeBuddy(nick) {
	$("#buddies li").each(function(index) {
		var self = $(this);
		if(self.text() == nick) {
			self.remove();
		}
	});
}

function chatlogWriter(event) {
	var data = JSON.parse(event.data);
	var msgtext = "";
	switch(data.type) {
	case "chat":
		msgtext = data.text;
		break;
	case "join":
		msgtext = "joined the room";
		addBuddy(data.user);
		break;
	case "leave":
		msgtext = "left the room";
		removeBuddy(data.user);
		break;
	}
	
	var elemNick = $("<span/>").addClass("nick").css("color", buddyColors[data.user]).text(data.user);
	var elemText = $("<span/>").addClass("msg").text(msgtext);
	var logentry = $("<li/>").addClass(data.type).append(elemNick).append(elemText);
	$("#chatlog").append(logentry);
	window.scrollTo(0, logentry.offset().top);
}

function initChatSender(ws) {
	var send = function() {
		var ct = $("#chattext")
		ws.send(ct.prop("value"));
		ct.prop("value","");
		ct.focus();
	};
	
	$("#sendbtn").click(send);
	$("#chattext").keyup(function(event) {
		if(event.keyCode==13) {
			send();
		}
	});
}

function Join(ws_url, nick) {
	var ws = new WebSocket(ws_url, "chat");
	ws.onopen = function(_) {
		ws.send(nick); 
		ws.onmessage = function(event) {
			var data = JSON.parse(event.data);
			if(data.ok) {
				ws.onmessage = chatlogWriter;
				for(i in data.buddies) {
					addBuddy(data.buddies[i]);
				}
				initChatSender(ws);
				ws.onclose = function(_) {
					alert("Connection lost. Try refreshing the page.");
				};
			} else {
				ws.close();
				askTryAgain(data.error, ws_url);
			}
		};
	};
}

function RunChat(ws_url) {
	var nick = "";
	while(nick == "") {
		nick = prompt("Choose a nickname");
		if(nick === null) {
			return;
		}
	}
	Join(ws_url, nick);
}