basic support for weechat protocol based on weechat.js
This commit is contained in:
parent
d4b760fc04
commit
f5869438b7
3 changed files with 136 additions and 8 deletions
121
js/protocol.js
Normal file
121
js/protocol.js
Normal 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;
|
||||
};
|
||||
}
|
|
@ -1,23 +1,24 @@
|
|||
var weechat = angular.module('weechat', []);
|
||||
|
||||
weechat.factory('connection', ['$rootScope', function($scope) {
|
||||
|
||||
protocol = new Protocol();
|
||||
var websocket = null;
|
||||
|
||||
var doSend = function(message) {
|
||||
msgs = message.replace(/[\r\n]+$/g, "").split("\n");
|
||||
for (var i = 0; i < msgs.length; i++) {
|
||||
console.log("sent", "⇐ " + msgs[i]);
|
||||
$scope.commands.push(msgs[i]);
|
||||
console.log('=' + msgs[i] + '=');
|
||||
$scope.commands.push("SENT: " + msgs[i]);
|
||||
}
|
||||
websocket.send(message);
|
||||
}
|
||||
var connect = function (hostport, proto, password) {
|
||||
websocket = new WebSocket("ws://" + hostport + "/weechat");
|
||||
|
||||
websocket.binaryType = "arraybuffer"
|
||||
|
||||
websocket.onopen = function (evt) {
|
||||
if (proto == "weechat") {
|
||||
doSend("init password=" + password + "\ninfo version\ntest\n");
|
||||
//doSend("init compression=off\nversion\n");
|
||||
} else {
|
||||
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) {
|
||||
console.log("recv", "⇒ " + 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();
|
||||
}
|
||||
websocket.onerror = function (evt) {
|
||||
|
@ -41,6 +45,7 @@ weechat.factory('connection', ['$rootScope', function($scope) {
|
|||
}
|
||||
|
||||
var sendMessage = function(message) {
|
||||
message = message + "\n"
|
||||
doSend(message);
|
||||
}
|
||||
return {
|
||||
|
|
|
@ -3,6 +3,7 @@
|
|||
<head>
|
||||
<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/protocol.js"></script>
|
||||
<script type="text/javascript" src="js/websockets.js"></script>
|
||||
</head>
|
||||
<body>
|
||||
|
@ -36,12 +37,13 @@
|
|||
</form>
|
||||
</div>
|
||||
<div ng-show="connected">
|
||||
{{ commands }}
|
||||
<div ng-repeat="command in commands">
|
||||
{{ command }}
|
||||
</div>
|
||||
<form ng-submit="sendMessage()">
|
||||
<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>
|
||||
</body>
|
||||
|
|
Loading…
Reference in a new issue