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', []);
|
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", "⇐ " + 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", "⇒ " + evt.data);
|
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();
|
$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 {
|
||||||
|
|
|
@ -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>
|
||||||
|
|
Loading…
Reference in a new issue