basic support for weechat protocol based on weechat.js

This commit is contained in:
David Cormier 2013-02-24 14:44:03 -05:00
parent d4b760fc04
commit f5869438b7
3 changed files with 136 additions and 8 deletions

121
js/protocol.js Normal file
View file

@ -0,0 +1,121 @@
var Protocol = function() {
var self = this;
var getInfo = function() {
var info = {};
info.key = getString();
info.value = getString();
return info;
};
var types = {
chr: getChar,
"int": getInt,
"str": getString,
"inf": getInfo,
};
//TODO: IMPLEMENT THIS STUFF
// chr: this.getChar,
// 'int': getInt,
// hacks
// lon: getPointer,
// str: getString,
// buf: getBuffer,
// ptr: getPointer,
// hacks
// tim: getPointer,
// htb: getHashtable,
// hda: getHdata,
// inf: Protocol.getInfo,
// inl: getInfolist,
// arr: array
// },
var _uiatos =function(uia) {
var _str = [];
for (var c = 0; c < uia.length; c++) {
_str[c] = String.fromCharCode(uia[c]);
}
return _str.join("");
};
var getInt = function() {
var parsed_data = new Uint8Array(getSlice(4));
var i = ((parsed_data[0] & 0xff) << 24) | ((parsed_data[1] & 0xff) << 16) | ((parsed_data[2] & 0xff) << 8) | (parsed_data[3] & 0xff);
return i;
};
var getChar = function() {
var parsed_data = new Uint8Array(getSlice(1));
return parsed_data[0];
}
var getString = function() {
var l = getInt();
if (l > 0) {
var s = getSlice(l);
var parsed_data = new Uint8Array(s);
return _uiatos(parsed_data);
}
return "";
};
var getSlice = function(length) {
var slice = self.data.slice(0,length);
self.data = self.data.slice(length);
return slice;
};
var getType = function() {
var t = getSlice(3);
return _uiatos(new Uint8Array(t));
};
var runType = function(type) {
if (type in types) {
return types[type]();
}
0;
};
var getHeader = function() {
return {
length: getInt(),
compression: getChar(),
}
};
var getId = function() {
return getString();
}
var getObject = function() {
var type = getType();
if (type) {
return object = {
type: type,
content: runType(type),
}
}
}
self.parse = function() {
var header = getHeader();
var id = getId();
var objects = [];
var object = getObject();
while(object) {
objects.push(object);
object = getObject();
}
return {
header: header,
id: id,
objects: objects,
}
}
self.setData = function (data) {
self.data = data;
};
}

View file

@ -1,23 +1,24 @@
var weechat = angular.module('weechat', []); var weechat = angular.module('weechat', []);
weechat.factory('connection', ['$rootScope', function($scope) { weechat.factory('connection', ['$rootScope', function($scope) {
protocol = new Protocol();
var websocket = null; var websocket = null;
var doSend = function(message) { var doSend = function(message) {
msgs = message.replace(/[\r\n]+$/g, "").split("\n"); msgs = message.replace(/[\r\n]+$/g, "").split("\n");
for (var i = 0; i < msgs.length; i++) { for (var i = 0; i < msgs.length; i++) {
console.log("sent", "&lArr; " + msgs[i]); console.log('=' + msgs[i] + '=');
$scope.commands.push(msgs[i]); $scope.commands.push("SENT: " + msgs[i]);
} }
websocket.send(message); websocket.send(message);
} }
var connect = function (hostport, proto, password) { var connect = function (hostport, proto, password) {
websocket = new WebSocket("ws://" + hostport + "/weechat"); websocket = new WebSocket("ws://" + hostport + "/weechat");
websocket.binaryType = "arraybuffer"
websocket.onopen = function (evt) { websocket.onopen = function (evt) {
if (proto == "weechat") { if (proto == "weechat") {
doSend("init password=" + password + "\ninfo version\ntest\n"); //doSend("init compression=off\nversion\n");
} else { } else {
doSend("PASS " + password + "\r\nNICK test\r\nUSER test 0 * :test\r\n"); doSend("PASS " + password + "\r\nNICK test\r\nUSER test 0 * :test\r\n");
} }
@ -30,7 +31,10 @@ weechat.factory('connection', ['$rootScope', function($scope) {
} }
websocket.onmessage = function (evt) { websocket.onmessage = function (evt) {
console.log("recv", "&rArr; " + evt.data); console.log("recv", "&rArr; " + evt.data);
$scope.commands.push(evt.data); protocol.setData(evt.data);
console.log(protocol.parse());
$scope.commands.push("RECV: " + evt.data + " TYPE:" + evt.type) ;
data = evt.data;
$scope.$apply(); $scope.$apply();
} }
websocket.onerror = function (evt) { websocket.onerror = function (evt) {
@ -41,6 +45,7 @@ weechat.factory('connection', ['$rootScope', function($scope) {
} }
var sendMessage = function(message) { var sendMessage = function(message) {
message = message + "\n"
doSend(message); doSend(message);
} }
return { return {

View file

@ -3,6 +3,7 @@
<head> <head>
<link href="css/bootstrap.min.css" rel="stylesheet" media="screen"> <link href="css/bootstrap.min.css" rel="stylesheet" media="screen">
<script type="text/javascript" src="js/angular.min.js"></script> <script type="text/javascript" src="js/angular.min.js"></script>
<script type="text/javascript" src="js/protocol.js"></script>
<script type="text/javascript" src="js/websockets.js"></script> <script type="text/javascript" src="js/websockets.js"></script>
</head> </head>
<body> <body>
@ -36,12 +37,13 @@
</form> </form>
</div> </div>
<div ng-show="connected"> <div ng-show="connected">
{{ commands }}
<div ng-repeat="command in commands"> <div ng-repeat="command in commands">
{{ command }} {{ command }}
</div> </div>
<form ng-submit="sendMessage()">
<input type="text" ng-model="command"></input> <input type="text" ng-model="command"></input>
<button class="btn btn-primary" ng-click="sendMessage()">Send</button> <input type="submit" class="btn btn-primary"></button>
</form>
</div> </div>
</div> </div>
</body> </body>