194 lines
7.4 KiB
JavaScript
194 lines
7.4 KiB
JavaScript
class MapEventHandler {
|
|
constructor(options, dashmap, ssl) {
|
|
this.options = options;
|
|
this.dashmap = dashmap;
|
|
this.ssl = ssl;
|
|
}
|
|
|
|
connect(user_id, host, port) {
|
|
var d = new Date();
|
|
var client_id = "dash-" + user_id + "-" + d.getMonth() + "-" + d.getDate() + "-" + d.getHours() + "-" + d.getMinutes() + "-" + d.getSeconds() + "-" + d.getMilliseconds();
|
|
console.log(client_id);
|
|
|
|
this.mqtt = new Paho.MQTT.Client(host, port, client_id);
|
|
var options = {
|
|
useSSL: this.ssl,
|
|
timeout: 3,
|
|
invocationContext: this,
|
|
onSuccess: this.onConnect.bind(this),
|
|
};
|
|
|
|
this.mqtt.onMessageArrived = this.onMessage.bind(this);
|
|
|
|
console.log('connecting to mqtt server...');
|
|
this.mqtt.connect(options);
|
|
}
|
|
|
|
onConnect(icontext) {
|
|
console.log('mqtt connected!');
|
|
var my = icontext.invocationContext;
|
|
|
|
if (my.options.track_rider) {
|
|
// subscribe to rider locations
|
|
console.log('subscribing to ' + my.options.channels.rider_location);
|
|
my.mqtt.subscribe(my.options.channels.rider_location);
|
|
|
|
// subscribe to rider status
|
|
console.log('subscribing to ' + my.options.channels.rider_status);
|
|
my.mqtt.subscribe(my.options.channels.rider_status);
|
|
|
|
// subscribe to rider availability
|
|
console.log('subscribing to ' + my.options.channels.rider_availability);
|
|
my.mqtt.subscribe(my.options.channels.rider_availability);
|
|
}
|
|
|
|
if (my.options.track_jo) {
|
|
// subscribe to jo locations
|
|
console.log('subscribing to ' + my.options.channels.jo_location);
|
|
my.mqtt.subscribe(my.options.channels.jo_location);
|
|
|
|
// subscribe to jo status
|
|
console.log('subscribing to ' + my.options.channels.jo_status);
|
|
my.mqtt.subscribe(my.options.channels.jo_status);
|
|
|
|
// subscribe to jo origin
|
|
console.log('subscribing to ' + my.options.channels.jo_origin);
|
|
my.mqtt.subscribe(my.options.channels.jo_origin);
|
|
}
|
|
|
|
}
|
|
|
|
onMessage(msg) {
|
|
// console.log(msg);
|
|
console.log('received message');
|
|
|
|
var channel = msg.destinationName;
|
|
var chan_split = channel.split('/');
|
|
var payload = msg.payloadString;
|
|
|
|
// handle different channels
|
|
switch (chan_split[0]) {
|
|
case "rider":
|
|
this.handleRider(chan_split, payload);
|
|
break;
|
|
case "jo":
|
|
this.handleJobOrder(chan_split, payload);
|
|
break;
|
|
}
|
|
}
|
|
|
|
handleRider(chan_split, payload) {
|
|
//console.log("rider message");
|
|
switch (chan_split[2]) {
|
|
case "location":
|
|
console.log("got location for rider " + chan_split[1] + " - " + payload);
|
|
var pl_split = payload.split(':');
|
|
console.log(pl_split);
|
|
|
|
// check for correct format
|
|
if (pl_split.length != 2)
|
|
break;
|
|
|
|
var lat = parseFloat(pl_split[0]);
|
|
var lng = parseFloat(pl_split[1]);
|
|
|
|
// TODO: check if available or not
|
|
this.dashmap.putRiderAvailableMarker(chan_split[1], lat, lng);
|
|
break;
|
|
case "status":
|
|
console.log("got status for rider " + chan_split[1] + " - " + payload);
|
|
switch (payload) {
|
|
case 'available':
|
|
this.dashmap.switchRiderStatus(chan_split[1], 'available');
|
|
break;
|
|
case 'jo':
|
|
console.log('jo status');
|
|
this.dashmap.switchRiderStatus(chan_split[1], 'jo');
|
|
break;
|
|
case 'logout':
|
|
this.dashmap.removeRiderMarker(chan_split[1]);
|
|
break;
|
|
}
|
|
break;
|
|
case "availability":
|
|
console.log("got availability for rider " + chan_split[1] + " - " + payload);
|
|
var obj = JSON.parse(payload);
|
|
|
|
var status = obj.status;
|
|
// console.log("status " + status);
|
|
switch (status) {
|
|
case 'rider_offline':
|
|
this.dashmap.rider_availability[chan_split[1]] = false;
|
|
this.dashmap.removeRiderMarker(chan_split[1]);
|
|
break;
|
|
case 'rider_online':
|
|
this.dashmap.rider_availability[chan_split[1]] = true;
|
|
var lat = parseFloat(obj.latitude);
|
|
var lng = parseFloat(obj.longitude);
|
|
|
|
// check if rider is available / unavailable
|
|
var dashmap = this.dashmap;
|
|
var url = dashmap.options.rider_availability_url;
|
|
var rider_availability_url = url.replace('[id]', chan_split[1]);
|
|
$.get(rider_availability_url).done(function(data) {
|
|
console.log('rider availability - ' + data);
|
|
switch (data) {
|
|
case 'available':
|
|
console.log('putting available marker ' + chan_split[1] + ' ' + lat + ':' + lng);
|
|
dashmap.switchRiderStatus(chan_split[1], 'available');
|
|
dashmap.putRiderAvailableMarker(chan_split[1], lat, lng);
|
|
break;
|
|
case 'unavailable':
|
|
console.log('putting active jo marker ' + chan_split[1] + ' ' + lat + ':' + lng);
|
|
dashmap.switchRiderStatus(chan_split[1], 'jo');
|
|
dashmap.putRiderActiveJOMarker(chan_split[1], lat, lng);
|
|
break;
|
|
}
|
|
});
|
|
break;
|
|
}
|
|
break;
|
|
}
|
|
}
|
|
|
|
handleJobOrder(chan_split, payload) {
|
|
console.log("jo message");
|
|
var id = chan_split[1];
|
|
switch (chan_split[2]) {
|
|
case "location":
|
|
// var my = this;
|
|
console.log("got location for jo " + id + " - " + payload);
|
|
var pl_split = payload.split(':');
|
|
|
|
// check for correct format
|
|
if (pl_split.length != 2)
|
|
break;
|
|
|
|
var lat = parseFloat(pl_split[0]);
|
|
var lng = parseFloat(pl_split[1]);
|
|
|
|
// move marker
|
|
console.log(lat + ' - ' + lng);
|
|
|
|
this.dashmap.putCustomerMarker(id, lat, lng);
|
|
break;
|
|
case "status":
|
|
console.log("got status for jo " + payload);
|
|
switch (payload) {
|
|
case 'cancel':
|
|
case 'fulfill':
|
|
case 'delete':
|
|
this.dashmap.removeCustomerMarker(id);
|
|
break;
|
|
}
|
|
break;
|
|
case "origin":
|
|
console.log("got origin for jo " + payload);
|
|
if (payload == 'mobile_app')
|
|
{
|
|
this.dashmap.switchJobOrderOrigin(chan_split[1], 'mobile');
|
|
}
|
|
break;
|
|
}
|
|
}
|
|
}
|