2023-02-11 21:49:07 +00:00
const path = require ( "path" ) ;
const { ipcRenderer } = require ( "electron" ) ;
const { v4 : uuidv4 } = require ( "uuid" ) ;
2021-11-19 16:30:17 +00:00
// https://stackoverflow.com/a/26227660
2023-02-11 21:49:07 +00:00
var appDataFolder =
process . env . APPDATA ||
( process . platform == "darwin"
? process . env . HOME + "/Library/Application Support"
: process . env . HOME + "/.config" ) ;
2021-11-19 16:30:17 +00:00
var configFolder = path . join ( appDataFolder , "FreeDATA" ) ;
2023-02-11 21:49:07 +00:00
var configPath = path . join ( configFolder , "config.json" ) ;
2021-11-19 16:30:17 +00:00
const config = require ( configPath ) ;
2022-03-10 20:29:30 +00:00
// set date format
2023-02-11 21:49:07 +00:00
const dateFormat = new Intl . DateTimeFormat ( "en-GB" , {
timeStyle : "long" ,
dateStyle : "full" ,
2022-03-10 20:29:30 +00:00
} ) ;
2022-03-24 19:49:13 +00:00
// set date format information
2023-02-11 21:49:07 +00:00
const dateFormatShort = new Intl . DateTimeFormat ( "en-GB" , {
year : "numeric" ,
month : "numeric" ,
day : "numeric" ,
hour : "numeric" ,
minute : "numeric" ,
second : "numeric" ,
hour12 : false ,
2022-03-24 19:49:13 +00:00
} ) ;
2022-04-02 16:40:12 +00:00
2023-02-11 21:49:07 +00:00
const dateFormatHours = new Intl . DateTimeFormat ( "en-GB" , {
hour : "numeric" ,
minute : "numeric" ,
hour12 : false ,
2022-04-02 16:40:12 +00:00
} ) ;
2022-03-10 20:29:30 +00:00
// split character
2023-02-11 21:49:07 +00:00
const split _char = "\0;\1;" ;
2022-03-24 19:49:13 +00:00
// global for our selected file we want to transmit
2022-03-29 20:24:35 +00:00
// ----------------- some chat globals
2023-02-11 21:49:07 +00:00
var filetype = "" ;
var file = "" ;
var filename = "" ;
2022-03-29 20:24:35 +00:00
var callsign _counter = 0 ;
2023-02-11 21:49:07 +00:00
var selected _callsign = "" ;
2023-02-12 23:15:12 +00:00
var lastIsWritingBroadcast = new Date ( ) . getTime ( ) ;
2022-03-29 20:24:35 +00:00
// -----------------------------------
2022-04-03 13:26:24 +00:00
2023-02-11 21:49:07 +00:00
var chatDB = path . join ( configFolder , "chatDB" ) ;
2022-03-10 20:29:30 +00:00
// ---- MessageDB
2023-02-11 21:49:07 +00:00
try {
var PouchDB = require ( "pouchdb" ) ;
} catch ( err ) {
console . log ( err ) ;
2022-06-15 12:34:17 +00:00
2023-02-11 21:49:07 +00:00
/ *
2022-06-15 12:34:17 +00:00
This is a fix for raspberryPi where we get an error when loading pouchdb because of
leveldown package isnt running on ARM devices .
pouchdb - browser does not depend on leveldb and seems to be working .
* /
2023-02-11 21:49:07 +00:00
console . log ( "using pouchdb-browser fallback" ) ;
var PouchDB = require ( "pouchdb-browser" ) ;
2022-06-15 12:34:17 +00:00
}
2023-02-11 21:49:07 +00:00
PouchDB . plugin ( require ( "pouchdb-find" ) ) ;
2022-12-26 19:41:58 +00:00
//PouchDB.plugin(require('pouchdb-replication'));
2022-03-10 20:29:30 +00:00
var db = new PouchDB ( chatDB ) ;
2022-11-17 21:17:50 +00:00
2022-12-26 19:41:58 +00:00
/ *
// REMOTE SYNC ATTEMPTS
var remoteDB = new PouchDB ( 'http://172.20.10.4:5984/chatDB' )
// we need express packages for running pouchdb sync "express-pouchdb"
var express = require ( 'express' ) ;
var app = express ( ) ;
//app.use('/chatDB', require('express-pouchdb')(PouchDB));
//app.listen(5984);
app . use ( '/chatDB' , require ( 'pouchdb-express-router' ) ( PouchDB ) ) ;
app . listen ( 5984 ) ;
db . sync ( 'http://172.20.10.4:5984/jojo' , {
//var sync = PouchDB.sync('chatDB', 'http://172.20.10.4:5984/chatDB', {
2022-11-17 21:17:50 +00:00
live : true ,
2022-12-26 19:41:58 +00:00
retry : false
2022-11-17 21:17:50 +00:00
} ) . on ( 'change' , function ( change ) {
// yo, something changed!
console . log ( change )
2022-12-26 19:41:58 +00:00
} ) . on ( 'paused' , function ( err ) {
2022-11-17 21:17:50 +00:00
// replication was paused, usually because of a lost connection
2022-12-26 19:41:58 +00:00
console . log ( err )
2022-11-17 21:17:50 +00:00
} ) . on ( 'active' , function ( info ) {
// replication was resumed
console . log ( info )
} ) . on ( 'error' , function ( err ) {
// totally unhandled error (shouldn't happen)
2022-12-26 19:41:58 +00:00
console . log ( err )
} ) . on ( 'denied' , function ( err ) {
// a document failed to replicate (e.g. due to permissions)
console . log ( err )
} ) . on ( 'complete' , function ( info ) {
// handle complete;
console . log ( info )
2022-11-17 21:17:50 +00:00
} ) ;
2022-12-26 19:41:58 +00:00
* /
2022-11-17 21:17:50 +00:00
2022-03-10 20:29:30 +00:00
var dxcallsigns = new Set ( ) ;
2022-03-14 19:21:15 +00:00
db . createIndex ( {
2023-02-11 21:49:07 +00:00
index : {
fields : [
"timestamp" ,
"uuid" ,
"dxcallsign" ,
"dxgrid" ,
"msg" ,
"checksum" ,
"type" ,
"command" ,
"status" ,
"percent" ,
"bytesperminute" ,
"_attachments" ,
] ,
} ,
} )
. then ( function ( result ) {
2022-03-24 19:49:13 +00:00
// handle result
2023-02-11 21:49:07 +00:00
console . log ( result ) ;
} )
. catch ( function ( err ) {
2022-03-24 19:49:13 +00:00
console . log ( err ) ;
2023-02-11 21:49:07 +00:00
} ) ;
2022-11-17 21:17:50 +00:00
2022-03-14 19:21:15 +00:00
db . find ( {
2023-02-11 21:49:07 +00:00
selector : {
timestamp : {
$exists : true ,
2022-03-24 19:49:13 +00:00
} ,
2023-02-11 21:49:07 +00:00
} ,
sort : [
{
timestamp : "asc" ,
} ,
] ,
} )
. then ( function ( result ) {
2022-03-24 19:49:13 +00:00
// handle result
2023-02-11 21:49:07 +00:00
if ( typeof result !== "undefined" ) {
result . docs . forEach ( function ( item ) {
//console.log(item)
// another query with attachments
db . get ( item . _id , {
attachments : true ,
} ) . then ( function ( item _with _attachments ) {
update _chat ( item _with _attachments ) ;
2022-03-24 19:49:13 +00:00
} ) ;
2023-02-11 21:49:07 +00:00
} ) ;
2022-03-14 19:21:15 +00:00
}
2023-02-11 21:49:07 +00:00
} )
. catch ( function ( err ) {
2022-03-24 19:49:13 +00:00
console . log ( err ) ;
2023-02-11 21:49:07 +00:00
} ) ;
2021-11-19 16:30:17 +00:00
// WINDOW LISTENER
2023-02-11 21:49:07 +00:00
window . addEventListener ( "DOMContentLoaded" , ( ) => {
// theme selector
if ( config . theme != "default" ) {
var theme _path =
"../node_modules/bootswatch/dist/" + config . theme + "/bootstrap.min.css" ;
document . getElementById ( "bootstrap_theme" ) . href = theme _path ;
} else {
var theme _path = "../node_modules/bootstrap/dist/css/bootstrap.min.css" ;
document . getElementById ( "bootstrap_theme" ) . href = theme _path ;
}
document
. querySelector ( "emoji-picker" )
. addEventListener ( "emoji-click" , ( event ) => {
var msg = document . getElementById ( "chatModuleMessage" ) ;
//Convert to utf-8--so we can just use utf-8 everywhere
msg . setRangeText ( event . detail . emoji . unicode . toString ( "utf-8" ) ) ;
//console.log(event.detail);
//msg.focus();
} ) ;
document . getElementById ( "emojipickerbutton" ) . addEventListener ( "click" , ( ) => {
var element = document . getElementById ( "emojipickercontainer" ) ;
console . log ( element . style . display ) ;
if ( element . style . display === "none" ) {
element . style . display = "block" ;
} else {
element . style . display = "none" ;
2022-04-03 13:26:24 +00:00
}
2023-02-11 21:49:07 +00:00
} ) ;
document
. getElementById ( "delete_selected_chat" )
. addEventListener ( "click" , ( ) => {
db . find ( {
selector : {
dxcallsign : selected _callsign ,
} ,
} )
. then ( function ( result ) {
// handle result
if ( typeof result !== "undefined" ) {
result . docs . forEach ( function ( item ) {
console . log ( item ) ;
db . get ( item . _id )
. then ( function ( doc ) {
db . remove ( doc )
. then ( function ( doc ) {
return location . reload ( ) ;
} )
. catch ( function ( err ) {
console . log ( err ) ;
2022-03-29 20:24:35 +00:00
} ) ;
2023-02-11 21:49:07 +00:00
} )
. catch ( function ( err ) {
console . log ( err ) ;
2022-03-29 20:24:35 +00:00
} ) ;
2023-02-11 21:49:07 +00:00
} ) ;
}
} )
. catch ( function ( err ) {
console . log ( err ) ;
2022-03-29 20:24:35 +00:00
} ) ;
2023-02-11 21:49:07 +00:00
} ) ;
document . getElementById ( "selectFilesButton" ) . addEventListener ( "click" , ( ) => {
//document.getElementById('selectFiles').click();
ipcRenderer . send ( "select-file" , {
title : "Title" ,
} ) ;
} ) ;
2022-11-08 18:53:14 +00:00
2023-02-11 21:49:07 +00:00
document . getElementById ( "ping" ) . addEventListener ( "click" , ( ) => {
ipcRenderer . send ( "run-tnc-command" , {
command : "ping" ,
dxcallsign : selected _callsign ,
} ) ;
} ) ;
2022-11-08 18:53:14 +00:00
2023-02-11 21:49:07 +00:00
document . addEventListener ( "keyup" , function ( event ) {
// Number 13 == Enter
if ( event . keyCode === 13 && ! event . shiftKey ) {
// Cancel the default action, if needed
event . preventDefault ( ) ;
// Trigger the button element with a click
document . getElementById ( "sendMessage" ) . click ( ) ;
}
} ) ;
2022-11-08 18:53:14 +00:00
2023-02-11 21:49:07 +00:00
// ADJUST TEXTAREA SIZE
document . getElementById ( "chatModuleMessage" ) . addEventListener ( "input" , ( ) => {
var textarea = document . getElementById ( "chatModuleMessage" ) ;
var text = textarea . value ;
2022-11-08 18:53:14 +00:00
2023-02-11 21:49:07 +00:00
if ( document . getElementById ( "expand_textarea" ) . checked ) {
var lines = 6 ;
} else {
var lines = text . split ( "\n" ) . length ;
2022-11-08 18:53:14 +00:00
2023-02-11 21:49:07 +00:00
if ( lines >= 6 ) {
lines = 6 ;
}
}
var message _container _height _offset = 130 + 20 * lines ;
var message _container _height = ` calc(100% - ${ message _container _height _offset } px) ` ;
document . getElementById ( "message-container" ) . style . height =
message _container _height ;
textarea . rows = lines ;
console . log ( textarea . value ) ;
2023-02-12 23:16:02 +00:00
if ( lastIsWritingBroadcast < new Date ( ) . getTime ( ) - 5 * 1000 ) {
2023-02-12 23:15:12 +00:00
//console.log("Sending FECIsWriting");
2023-02-14 15:00:34 +00:00
console . log ( config . enable _is _writing ) ;
if ( config . enable _is _writing == "True" ) {
2023-02-14 15:00:10 +00:00
ipcRenderer . send ( "tnc-fec-iswriting" ) ;
}
2023-02-12 23:15:12 +00:00
lastIsWritingBroadcast = new Date ( ) . getTime ( ) ;
}
2023-02-11 21:49:07 +00:00
} ) ;
document . getElementById ( "expand_textarea" ) . addEventListener ( "click" , ( ) => {
var textarea = document . getElementById ( "chatModuleMessage" ) ;
if ( document . getElementById ( "expand_textarea" ) . checked ) {
var lines = 6 ;
document . getElementById ( "expand_textarea_button" ) . className =
"bi bi-chevron-compact-down" ;
} else {
var lines = 1 ;
document . getElementById ( "expand_textarea_button" ) . className =
"bi bi-chevron-compact-up" ;
}
2022-04-02 12:54:43 +00:00
2023-02-11 21:49:07 +00:00
var message _container _height _offset = 130 + 20 * lines ;
//var message_container_height_offset = 90 + (23*lines);
var message _container _height = ` calc(100% - ${ message _container _height _offset } px) ` ;
document . getElementById ( "message-container" ) . style . height =
message _container _height ;
textarea . rows = lines ;
console . log ( textarea . rows ) ;
} ) ;
// NEW CHAT
document
. getElementById ( "createNewChatButton" )
. addEventListener ( "click" , ( ) => {
var dxcallsign = document . getElementById ( "chatModuleNewDxCall" ) . value ;
var uuid = uuidv4 ( ) ;
db . post ( {
_id : uuid ,
timestamp : Math . floor ( Date . now ( ) / 1000 ) ,
dxcallsign : dxcallsign . toUpperCase ( ) ,
dxgrid : "---" ,
msg : "null" ,
checksum : "null" ,
type : "newchat" ,
status : "null" ,
uuid : uuid ,
} )
. then ( function ( response ) {
// handle response
console . log ( "new database entry" ) ;
console . log ( response ) ;
} )
. catch ( function ( err ) {
console . log ( err ) ;
2022-04-02 12:54:43 +00:00
} ) ;
2023-02-11 21:49:07 +00:00
update _chat _obj _by _uuid ( uuid ) ;
2022-04-02 12:54:43 +00:00
} ) ;
2022-06-07 09:31:59 +00:00
2023-02-11 21:49:07 +00:00
// SEND MSG
document . getElementById ( "sendMessage" ) . addEventListener ( "click" , ( ) => {
document . getElementById ( "emojipickercontainer" ) . style . display = "none" ;
var dxcallsign = selected _callsign . toUpperCase ( ) ;
var textarea = document . getElementById ( "chatModuleMessage" ) ;
var chatmessage = textarea . value ;
//Remove non-printable chars from begining and end of string--should save us a byte here and there
chatmessage = chatmessage . toString ( ) . trim ( ) ;
// reset textarea size
var message _container _height _offset = 150 ;
var message _container _height = ` calc(100% - ${ message _container _height _offset } px) ` ;
document . getElementById ( "message-container" ) . style . height =
message _container _height ;
textarea . rows = 1 ;
document . getElementById ( "expand_textarea_button" ) . className =
"bi bi-chevron-compact-up" ;
document . getElementById ( "expand_textarea" ) . checked = false ;
console . log ( file ) ;
console . log ( filename ) ;
console . log ( filetype ) ;
if ( filetype == "" ) {
filetype = "plain/text" ;
}
var timestamp = Math . floor ( Date . now ( ) / 1000 ) ;
var file _checksum = crc32 ( file ) . toString ( 16 ) . toUpperCase ( ) ;
console . log ( file _checksum ) ;
var data _with _attachment =
timestamp +
split _char +
chatmessage +
split _char +
filename +
split _char +
filetype +
split _char +
file ;
document . getElementById ( "selectFilesButton" ) . innerHTML = ` ` ;
var uuid = uuidv4 ( ) ;
let uuidlast = uuid . lastIndexOf ( "-" ) ;
uuidlast += 1 ;
if ( uuidlast > 0 ) {
uuid = uuid . substring ( uuidlast ) ;
}
console . log ( data _with _attachment ) ;
let Data = {
command : "send_message" ,
dxcallsign : dxcallsign ,
mode : 255 ,
frames : 1 ,
data : data _with _attachment ,
checksum : file _checksum ,
uuid : uuid ,
} ;
ipcRenderer . send ( "run-tnc-command" , Data ) ;
db . post ( {
_id : uuid ,
timestamp : timestamp ,
dxcallsign : dxcallsign ,
dxgrid : "null" ,
msg : chatmessage ,
checksum : file _checksum ,
type : "transmit" ,
status : "transmit" ,
uuid : uuid ,
_attachments : {
[ filename ] : {
content _type : filetype ,
//data: btoa(file)
data : btoa _FD ( file ) ,
} ,
} ,
2021-11-19 16:30:17 +00:00
} )
2023-02-11 21:49:07 +00:00
. then ( function ( response ) {
// handle response
console . log ( "new database entry" ) ;
console . log ( response ) ;
} )
. catch ( function ( err ) {
console . log ( err ) ;
} ) ;
update _chat _obj _by _uuid ( uuid ) ;
// clear input
document . getElementById ( "chatModuleMessage" ) . value = "" ;
// after adding file data to our attachment variable, delete it from global
filetype = "" ;
file = "" ;
filename = "" ;
} ) ;
// cleanup after transmission
filetype = "" ;
file = "" ;
filename = "" ;
2022-03-24 19:49:13 +00:00
} ) ;
2023-02-11 21:49:07 +00:00
ipcRenderer . on ( "return-selected-files" , ( event , arg ) => {
filetype = arg . mime ;
console . log ( filetype ) ;
2022-06-09 12:54:42 +00:00
2023-02-11 21:49:07 +00:00
file = arg . data ;
filename = arg . filename ;
document . getElementById ( "selectFilesButton" ) . innerHTML = `
2022-04-03 13:26:24 +00:00
< span class = "position-absolute top-0 start-85 translate-middle p-2 bg-danger border border-light rounded-circle" >
2022-03-24 19:49:13 +00:00
< span class = "visually-hidden" > New file selected < / s p a n >
< / s p a n >
` ;
2022-03-14 19:21:15 +00:00
} ) ;
2023-02-11 21:49:07 +00:00
ipcRenderer . on ( "action-update-transmission-status" , ( event , arg ) => {
var data = arg [ "data" ] [ 0 ] ;
console . log ( data . status ) ;
db . get ( data . uuid , {
attachments : true ,
} )
. then ( function ( doc ) {
return db . put ( {
_id : data . uuid ,
_rev : doc . _rev ,
timestamp : doc . timestamp ,
dxcallsign : doc . dxcallsign ,
dxgrid : doc . dxgrid ,
msg : doc . msg ,
checksum : doc . checksum ,
type : "transmit" ,
status : data . status ,
percent : data . percent ,
bytesperminute : data . bytesperminute ,
uuid : doc . uuid ,
_attachments : doc . _attachments ,
} ) ;
} )
. then ( function ( response ) {
update _chat _obj _by _uuid ( data . uuid ) ;
} )
. catch ( function ( err ) {
console . log ( err ) ;
console . log ( data ) ;
2022-03-24 19:49:13 +00:00
} ) ;
2022-03-10 20:29:30 +00:00
} ) ;
2023-02-14 03:49:26 +00:00
//Render is typing message in correct chat window
2023-02-14 03:50:05 +00:00
ipcRenderer . on ( "action-show-feciswriting" , ( event , arg ) => {
2023-02-14 03:49:26 +00:00
//console.log("In action-show-feciswriting");
//console.log(arg);
let uuid = uuidv4 . toString ( ) ;
let dxcallsign = arg [ "data" ] [ 0 ] [ "dxcallsign" ] ;
var new _message = `
2023-02-14 14:31:08 +00:00
< div class = "m-auto mt-1 p-0 w-25 rounded bg-secondary bg-gradient" id = "msg-${uuid}" >
< p class = "text-white mb-0 text-break" style = "font-size: 0.7rem;" > < i class = "m-1 bi bi-pencil" > < /i><i id="msg-${uuid}-icon" class="m-1 bi bi-wifi-1"></i > $ { dxcallsign } is typing ... . < / p >
2023-02-14 03:49:26 +00:00
< / d i v >
` ;
var id = "chat-" + dxcallsign ;
let chatwin = document . getElementById ( id ) ;
if ( chatwin == undefined ) {
//console.log("Element not found!!!!! :(");
return ;
}
chatwin . insertAdjacentHTML ( "beforeend" , new _message ) ;
scrollMessagesToBottom ( ) ;
let animIcon = document . getElementById ( "msg-" + uuid + "-icon" ) ;
//Remove notification after about 4.5 seconds hopefully enough time before a second notification can come in
setTimeout ( function ( ) {
2023-02-14 03:50:05 +00:00
animIcon . classList = "m-1 bi bi-wifi-2" ;
2023-02-14 03:49:26 +00:00
} , 1000 ) ;
setTimeout ( function ( ) {
2023-02-14 03:50:05 +00:00
animIcon . classList = "m-1 bi bi-wifi" ;
2023-02-14 03:49:26 +00:00
} , 2000 ) ;
setTimeout ( function ( ) {
2023-02-14 03:50:05 +00:00
animIcon . classList = "m-1 bi bi-wifi-2" ;
2023-02-14 03:49:26 +00:00
} , 3000 ) ;
setTimeout ( function ( ) {
2023-02-14 03:50:05 +00:00
animIcon . classList = "m-1 bi bi-wifi-1" ;
2023-02-14 03:49:26 +00:00
} , 4000 ) ;
setTimeout ( ( ) => {
2023-02-14 03:50:05 +00:00
let feciw = document . getElementById ( "msg-" + uuid ) ;
2023-02-14 03:49:26 +00:00
feciw . remove ( ) ;
} , 4500 ) ;
} ) ;
2023-02-11 21:49:07 +00:00
ipcRenderer . on ( "action-new-msg-received" , ( event , arg ) => {
console . log ( arg . data ) ;
var new _msg = arg . data ;
new _msg . forEach ( function ( item ) {
console . log ( item . status ) ;
let obj = new Object ( ) ;
//handle ping
if ( item . ping == "received" ) {
obj . timestamp = parseInt ( item . timestamp ) ;
obj . dxcallsign = item . dxcallsign ;
obj . dxgrid = item . dxgrid ;
obj . uuid = item . uuid ;
obj . command = "ping" ;
obj . checksum = "null" ;
obj . msg = "null" ;
obj . status = item . status ;
obj . snr = item . snr ;
obj . type = "ping" ;
obj . filename = "null" ;
obj . filetype = "null" ;
obj . file = "null" ;
add _obj _to _database ( obj ) ;
update _chat _obj _by _uuid ( obj . uuid ) ;
// handle beacon
} else if ( item . beacon == "received" ) {
obj . timestamp = parseInt ( item . timestamp ) ;
obj . dxcallsign = item . dxcallsign ;
obj . dxgrid = item . dxgrid ;
obj . uuid = item . uuid ;
obj . command = "beacon" ;
obj . checksum = "null" ;
obj . msg = "null" ;
obj . status = item . status ;
obj . snr = item . snr ;
obj . type = "beacon" ;
obj . filename = "null" ;
obj . filetype = "null" ;
obj . file = "null" ;
add _obj _to _database ( obj ) ;
update _chat _obj _by _uuid ( obj . uuid ) ;
// handle ARQ transmission
} else if ( item . arq == "transmission" && item . status == "received" ) {
//var encoded_data = atob(item.data);
//var encoded_data = Buffer.from(item.data,'base64').toString('utf-8');
var encoded _data = atob _FD ( item . data ) ;
var splitted _data = encoded _data . split ( split _char ) ;
console . log ( splitted _data ) ;
obj . timestamp = parseInt ( splitted _data [ 4 ] ) ;
obj . dxcallsign = item . dxcallsign ;
obj . dxgrid = item . dxgrid ;
obj . command = splitted _data [ 1 ] ;
obj . checksum = splitted _data [ 2 ] ;
// convert message to unicode from utf8 because of emojis
//No, don't convert; we're already UTF-8!!!!!
obj . uuid = splitted _data [ 3 ] ;
obj . msg = splitted _data [ 5 ] ;
obj . status = "null" ;
obj . snr = "null" ;
obj . type = "received" ;
obj . filename = splitted _data [ 6 ] ;
obj . filetype = splitted _data [ 7 ] ;
//obj.file = btoa(splitted_data[8]);
obj . file = btoa _FD ( splitted _data [ 8 ] ) ;
add _obj _to _database ( obj ) ;
update _chat _obj _by _uuid ( obj . uuid ) ;
}
} ) ;
//window.location = window.location;
2022-03-10 20:29:30 +00:00
} ) ;
2022-06-07 09:31:59 +00:00
2022-03-10 20:29:30 +00:00
// Update chat list
2023-02-11 21:49:07 +00:00
update _chat = function ( obj ) {
var dxcallsign = obj . dxcallsign ;
var timestamp = dateFormat . format ( obj . timestamp * 1000 ) ;
var timestampShort = dateFormatShort . format ( obj . timestamp * 1000 ) ;
var timestampHours = dateFormatHours . format ( obj . timestamp * 1000 ) ;
var dxgrid = obj . dxgrid ;
// define shortmessage
if ( obj . msg == "null" || obj . msg == "NULL" ) {
var shortmsg = obj . type ;
} else {
var shortmsg = obj . msg ;
var maxlength = 30 ;
var shortmsg =
shortmsg . length > maxlength
? shortmsg . substring ( 0 , maxlength - 3 ) + "..."
: shortmsg ;
}
try {
//console.log(Object.keys(obj._attachments)[0].length)
if (
typeof obj . _attachments !== "undefined" &&
Object . keys ( obj . _attachments ) [ 0 ] . length > 0
) {
//var filename = obj._attachments;
var filename = Object . keys ( obj . _attachments ) [ 0 ] ;
var filetype = filename . split ( "." ) [ 1 ] ;
var filesize = obj . _attachments [ filename ] [ "length" ] + " Bytes" ;
if ( filesize == "undefined Bytes" ) {
// get filesize of new submitted data
// not that nice....
// we really should avoid converting back from base64 for performance reasons...
//var filesize = Math.ceil(atob(obj._attachments[filename]["data"]).length) + "Bytes";
var filesize =
Math . ceil ( atob _FD ( obj . _attachments [ filename ] [ "data" ] ) . length ) +
" Bytes" ;
}
// check if image, then display it
if ( filetype == "image/png" || filetype == "png" ) {
var fileheader = `
2022-11-11 14:10:31 +00:00
< div class = "card-header border-0 bg-transparent text-end p-0 mb-0 hover-overlay" >
2022-11-11 14:21:49 +00:00
< img class = "w-100 rounded-2" src = "data:image/png;base64,${obj._attachments[filename][" data "]}" >
2022-11-11 14:10:31 +00:00
< p class = "text-right mb-0 p-1 text-black" style = "text-align: right; font-size : 1rem" >
< span class = "p-1" style = "text-align: right; font-size : 0.8rem" > $ { filename } < / s p a n >
< span class = "p-1" style = "text-align: right; font-size : 0.8rem" > $ { filesize } < / s p a n >
< i class = "bi bi-filetype-${filetype}" style = "font-size: 2rem;" > < / i >
< / p >
< / d i v >
< hr class = "m-0 p-0" >
` ;
2023-02-11 21:49:07 +00:00
} else {
var fileheader = `
2022-04-10 09:37:09 +00:00
< div class = "card-header border-0 bg-transparent text-end p-0 mb-0 hover-overlay" >
2022-03-24 19:49:13 +00:00
< p class = "text-right mb-0 p-1 text-black" style = "text-align: right; font-size : 1rem" >
2022-04-10 09:37:09 +00:00
< span class = "p-1" style = "text-align: right; font-size : 0.8rem" > $ { filename } < / s p a n >
< span class = "p-1" style = "text-align: right; font-size : 0.8rem" > $ { filesize } < / s p a n >
2022-11-11 14:10:31 +00:00
< i class = "bi bi-filetype-${filetype}" style = "font-size: 2rem;" > < / i >
2022-03-24 19:49:13 +00:00
< / p >
< / d i v >
2022-04-10 09:37:09 +00:00
< hr class = "m-0 p-0" >
` ;
2023-02-11 21:49:07 +00:00
}
2022-11-11 14:10:31 +00:00
2023-02-11 21:49:07 +00:00
var controlarea _transmit = `
2022-04-10 09:37:09 +00:00
< div class = "ms-auto" id = "msg-${obj._id}-control-area" >
< button class = "btn bg-transparent p-1 m-1" > < i class = "bi bi-arrow-repeat" id = "retransmit-msg-${obj._id}" style = "font-size: 1.2rem; color: grey;" > < / i > < / b u t t o n >
< button class = "btn bg-transparent p-1 m-1" > < i class = "bi bi-download" id = "save-file-msg-${obj._id}" style = "font-size: 1.2rem; color: grey;" > < / i > < / b u t t o n >
2023-02-19 02:02:13 +00:00
< button class = "btn bg-transparent p-1 m-1" > < i class = "bi bi-trash" id = "del-msg-${obj._id}" style = "font-size: 1.2rem; color: grey;" > < / i > < / b u t t o n >
2022-04-10 09:37:09 +00:00
< / d i v >
2022-03-24 19:49:13 +00:00
` ;
2022-04-10 09:37:09 +00:00
2023-02-11 21:49:07 +00:00
var controlarea _receive = `
2022-04-10 09:37:09 +00:00
< div class = "me-auto" id = "msg-${obj._id}-control-area" >
< button class = "btn bg-transparent p-1 m-1" > < i class = "bi bi-download" id = "save-file-msg-${obj._id}" style = "font-size: 1.2rem; color: grey;" > < / i > < / b u t t o n >
2023-02-19 02:02:13 +00:00
< button class = "btn bg-transparent p-1 m-1" > < i class = "bi bi-trash" id = "del-msg-${obj._id}" style = "font-size: 1.2rem; color: grey;" > < / i > < / b u t t o n >
2022-04-10 09:37:09 +00:00
< / d i v >
2023-02-11 21:49:07 +00:00
` ;
} else {
var filename = "" ;
var fileheader = "" ;
var filetype = "text/plain" ;
var controlarea _transmit = `
2022-04-10 09:37:09 +00:00
< div class = "ms-auto" id = "msg-${obj._id}-control-area" >
< button class = "btn bg-transparent p-1 m-1" > < i class = "bi bi-arrow-repeat" id = "retransmit-msg-${obj._id}" style = "font-size: 1.2rem; color: grey;" > < / i > < / b u t t o n >
2023-02-19 02:02:13 +00:00
< button class = "btn bg-transparent p-1 m-1" > < i class = "bi bi-trash" id = "del-msg-${obj._id}" style = "font-size: 1.2rem; color: grey;" > < / i > < / b u t t o n >
2022-04-10 09:37:09 +00:00
< / d i v >
` ;
2023-02-19 02:02:13 +00:00
var controlarea _receive = `
< div class = "float-start" id = "msg-${obj._id}-control-area" >
< button class = "btn bg-transparent p-1 m-1" > < i class = "bi bi-trash" id = "del-msg-${obj._id}" style = "font-size: 1.2rem; color: grey;" > < / i > < / b u t t o n >
< / d i v >
` ;
2023-02-11 21:49:07 +00:00
}
} catch ( err ) {
console . log ( "error with database parsing..." ) ;
console . log ( err ) ;
}
// CALLSIGN LIST
if ( ! document . getElementById ( "chat-" + dxcallsign + "-list" ) ) {
// increment callsign counter
callsign _counter ++ ;
if ( callsign _counter == 1 ) {
var callsign _selected = "active show" ;
//document.getElementById('chatModuleDxCall').value = dxcallsign;
selected _callsign = dxcallsign ;
2022-03-27 19:04:04 +00:00
}
2023-02-11 21:49:07 +00:00
var new _callsign = `
2022-03-29 15:42:54 +00:00
< a class = "list-group-item list-group-item-action rounded-4 rounded-top rounded-bottom border-1 mb-2 ${callsign_selected}" id = "chat-${dxcallsign}-list" data - bs - toggle = "list" href = "#chat-${dxcallsign}" role = "tab" aria - controls = "chat-${dxcallsign}" >
2022-04-02 12:54:43 +00:00
2022-03-10 20:29:30 +00:00
< div class = "d-flex w-100 justify-content-between" >
2022-04-02 12:54:43 +00:00
< div class = "rounded-circle p-0" >
< i class = "bi bi-person-circle p-1" style = "font-size:2rem;" > < / i >
< / d i v >
2022-04-02 16:40:12 +00:00
2022-03-10 20:29:30 +00:00
< h5 class = "mb-1" > $ { dxcallsign } < / h 5 >
2022-04-02 16:40:12 +00:00
< span class = "badge bg-secondary text-white p-1 h-100" id = "chat-${dxcallsign}-list-dxgrid" > < small > $ { dxgrid } < / s m a l l > < / s p a n >
< span style = "font-size:0.8rem;" id = "chat-${dxcallsign}-list-time" > $ { timestampHours } < / s p a n >
< span class = "position-absolute m-2 bottom-0 end-0" style = "font-size:0.8rem;" id = "chat-${dxcallsign}-list-shortmsg" > $ { shortmsg } < / s p a n >
2022-03-10 20:29:30 +00:00
< / d i v >
2022-04-02 16:40:12 +00:00
2022-03-10 20:29:30 +00:00
< / a >
2021-11-19 17:49:36 +00:00
2022-03-10 20:29:30 +00:00
` ;
2023-02-11 21:49:07 +00:00
document
. getElementById ( "list-tab" )
. insertAdjacentHTML ( "beforeend" , new _callsign ) ;
var message _area = `
2022-03-29 15:42:54 +00:00
< div class = "tab-pane fade ${callsign_selected}" id = "chat-${dxcallsign}" role = "tabpanel" aria - labelledby = "chat-${dxcallsign}-list" > < / d i v >
2022-03-10 20:29:30 +00:00
` ;
2023-02-11 21:49:07 +00:00
document
. getElementById ( "nav-tabContent" )
. insertAdjacentHTML ( "beforeend" , message _area ) ;
// create eventlistener for listening on clicking on a callsign
document
. getElementById ( "chat-" + dxcallsign + "-list" )
. addEventListener ( "click" , function ( ) {
//document.getElementById('chatModuleDxCall').value = dxcallsign;
selected _callsign = dxcallsign ;
setTimeout ( scrollMessagesToBottom , 200 ) ;
} ) ;
2022-09-05 12:03:10 +00:00
2022-04-02 16:40:12 +00:00
// if callsign entry already exists - update
2023-02-11 21:49:07 +00:00
} else {
// gridsquare - update only on receive
if ( obj . type !== "transmit" ) {
document . getElementById ( "chat-" + dxcallsign + "-list-dxgrid" ) . innerHTML =
dxgrid ;
2022-03-10 20:29:30 +00:00
}
2023-02-11 21:49:07 +00:00
// time
document . getElementById ( "chat-" + dxcallsign + "-list-time" ) . innerHTML =
timestampHours ;
// short message
document . getElementById ( "chat-" + dxcallsign + "-list-shortmsg" ) . innerHTML =
shortmsg ;
}
// APPEND MESSAGES TO CALLSIGN
if ( ! document . getElementById ( "msg-" + obj . _id ) ) {
if ( obj . type == "ping" ) {
var new _message = `
2022-04-10 09:37:09 +00:00
< div class = "m-auto mt-1 p-0 w-50 rounded bg-secondary bg-gradient" id = "msg-${obj._id}" >
< p class = "text-small text-white mb-0 text-break" style = "font-size: 0.7rem;" > < i class = "m-3 bi bi-arrow-left-right" > < / i > s n r : $ { o b j . s n r } - $ { t i m e s t a m p } < / p >
2022-03-24 19:49:13 +00:00
< / d i v >
` ;
2023-02-11 21:49:07 +00:00
}
if ( obj . type == "beacon" ) {
var new _message = `
2022-04-10 09:37:09 +00:00
< div class = "p-0 rounded m-auto mt-1 w-50 bg-info bg-gradient" id = "msg-${obj._id}" >
< p class = "text-small text-white text-break" style = "font-size: 0.7rem;" > < i class = "m-3 bi bi-broadcast" > < / i > s n r : $ { o b j . s n r } - $ { t i m e s t a m p } < / p >
2022-03-24 19:49:13 +00:00
< / d i v >
` ;
2023-02-11 21:49:07 +00:00
}
if ( obj . type == "newchat" ) {
var new _message = `
2022-04-10 09:37:09 +00:00
< div class = "p-0 rounded m-auto mt-1 w-50 bg-light bg-gradient" id = "msg-${obj._id}" >
2022-04-10 17:20:58 +00:00
< p class = "text-small text-dark text-break" style = "font-size: 0.7rem;" > < i class = "m-3 bi bi-file-earmark-plus" > < / i > n e w c h a t o p e n e d - $ { t i m e s t a m p } < / p >
2022-04-02 12:54:43 +00:00
< / d i v >
` ;
2023-02-11 21:49:07 +00:00
}
// CHECK FOR NEW LINE AND REPLACE WITH <br>
var message _html = obj . msg . replaceAll ( /\n/g , "<br>" ) ;
if ( obj . type == "received" ) {
var new _message = `
2022-04-10 09:37:09 +00:00
< div class = "d-flex align-items-center" style = "margin-left: auto;" > <!-- max - width : 75 % ; -- >
< div class = "mt-3 rounded-3 mb-0" style = "max-width: 75%;" id = "msg-${obj._id}" >
2022-03-24 19:49:13 +00:00
<!-- < p class = "font-monospace text-small mb-0 text-muted text-break" > $ { timestamp } < / p > - - >
2022-03-12 14:06:49 +00:00
< div class = "card border-light bg-light" id = "msg-${obj._id}" >
2022-03-24 19:49:13 +00:00
$ { fileheader }
2022-04-07 09:19:29 +00:00
2022-11-10 12:02:17 +00:00
< div class = "card-body rounded-3 p-0" >
2022-04-03 13:26:24 +00:00
< p class = "card-text p-2 mb-0 text-break text-wrap" > $ { message _html } < / p >
2022-03-24 19:49:13 +00:00
< p class = "text-right mb-0 p-1 text-white" style = "text-align: left; font-size : 0.9rem" >
< span class = "badge bg-light text-muted" > $ { timestamp } < / s p a n >
< / p >
2022-03-12 14:06:49 +00:00
< / d i v >
< / d i v >
2022-04-10 09:37:09 +00:00
< / d i v >
2023-02-19 02:02:13 +00:00
$ { controlarea _receive }
2022-03-10 20:29:30 +00:00
< / d i v >
` ;
2023-02-11 21:49:07 +00:00
}
2022-06-09 12:11:39 +00:00
2023-02-11 21:49:07 +00:00
if ( obj . type == "transmit" ) {
//console.log('msg-' + obj._id + '-status')
if ( obj . status == "failed" ) {
var progressbar _bg = "bg-danger" ;
} else {
var progressbar _bg = "bg-primary" ;
}
//Sneak in low graphics mode if so enabled for progress bars
if ( config . high _graphics . toString ( ) . toUpperCase ( ) != "TRUE" ) {
progressbar _bg += " disable-effects" ;
//console.log("Low graphics enabled for chat module");
}
var new _message = `
2022-04-10 09:37:09 +00:00
< div class = "d-flex align-items-center" > <!-- max - width : 75 % ; w - 75 -- >
$ { controlarea _transmit }
< div class = "rounded-3 mt-2 mb-0" style = "max-width: 75%;" > <!-- w - 100 style = "margin-left: auto;" -- >
2022-03-24 19:49:13 +00:00
<!-- < p class = "font-monospace text-right mb-0 text-muted" style = "text-align: right;" > $ { timestamp } < / p > - - >
2023-02-11 21:49:07 +00:00
< div class = "card border-primary bg-primary" id = " msg - $ {
obj . _id
} " >
2022-03-24 19:49:13 +00:00
$ { fileheader }
2022-04-07 09:19:29 +00:00
2022-11-10 12:02:17 +00:00
< div class = "card-body rounded-3 p-0 text-right bg-primary" >
2022-04-10 09:37:09 +00:00
< p class = "card-text p-1 mb-0 text-white text-break text-wrap" > $ { message _html } < / p >
2022-03-24 19:49:13 +00:00
< p class = "text-right mb-0 p-1 text-white" style = "text-align: right; font-size : 0.9rem" >
2022-04-07 09:19:29 +00:00
< span class = "text-light" style = "font-size: 0.7rem;" > $ { timestamp } - < / s p a n >
2022-04-10 09:37:09 +00:00
2023-02-11 21:49:07 +00:00
< span class = "text-white" id = " msg - $ {
obj . _id
} - status " style=" font - size : 0.8 rem ; " > $ { get _icon _for _state (
obj . status
) } < / s p a n >
<!-- < button type = "button" id = " retransmit - msg - $ {
obj . _id
} " class=" btn btn - sm btn - light p - 0 " style=" height : 20 px ; width : 30 px "><i class=" bi bi - arrow - repeat " style=" font - size : 0.9 rem ; color : black ; " > < / i > < / b u t t o n > - - >
2022-03-24 19:49:13 +00:00
< / p >
2022-04-07 09:19:29 +00:00
2022-05-01 08:55:56 +00:00
< div class = "progress p-0 m-0 rounded-0 rounded-bottom bg-secondary" style = "height: 10px;" >
2023-02-11 21:49:07 +00:00
< div class = "progress-bar progress-bar-striped ${progressbar_bg} p-0 m-0 rounded-0 force-gpu" id = " msg - $ {
obj . _id
} - progress " role=" progressbar " style=" width : $ {
obj . percent
} % ; " aria-valuenow=" $ { obj . percent } " aria-valuemin=" 0 " aria-valuemax=" 100 " >
2022-05-01 08:55:56 +00:00
< / d i v >
2023-02-19 02:02:13 +00:00
2023-02-11 21:49:07 +00:00
< p class = "justify-content-center d-flex position-absolute m-0 p-0 w-100 text-white" style = "font-size: xx-small" id = " msg - $ {
obj . _id
} - progress - information " >
2022-05-01 08:55:56 +00:00
$ { obj . percent } % - $ { obj . bytesperminute } Bpm
< / p >
2022-04-07 09:19:29 +00:00
< / d i v >
2022-03-12 14:06:49 +00:00
< / d i v >
< / d i v >
2022-03-24 19:49:13 +00:00
2022-03-10 20:29:30 +00:00
< / d i v >
2022-04-10 09:37:09 +00:00
< / d i v >
2022-03-24 19:49:13 +00:00
` ;
2023-02-11 21:49:07 +00:00
}
// CHECK CHECK CHECK --> This could be done better
var id = "chat-" + obj . dxcallsign ;
document . getElementById ( id ) . insertAdjacentHTML ( "beforeend" , new _message ) ;
2022-04-07 09:19:29 +00:00
2022-06-09 12:11:39 +00:00
/* UPDATE EXISTING ELEMENTS */
2023-02-11 21:49:07 +00:00
} else if ( document . getElementById ( "msg-" + obj . _id ) ) {
console . log ( "element already exists......" ) ;
console . log ( obj ) ;
console . log (
document
. getElementById ( "msg-" + obj . _id + "-progress" )
. getAttribute ( "aria-valuenow" )
) ;
document . getElementById ( "msg-" + obj . _id + "-status" ) . innerHTML =
get _icon _for _state ( obj . status ) ;
document
. getElementById ( "msg-" + obj . _id + "-progress" )
. setAttribute ( "aria-valuenow" , obj . percent ) ;
document
. getElementById ( "msg-" + obj . _id + "-progress" )
. setAttribute ( "style" , "width:" + obj . percent + "%;" ) ;
document . getElementById (
"msg-" + obj . _id + "-progress-information"
) . innerHTML = obj . percent + "% - " + obj . bytesperminute + " Bpm" ;
if ( obj . percent >= 100 ) {
//document.getElementById('msg-' + obj._id + '-progress').classList.remove("progress-bar-striped");
document
. getElementById ( "msg-" + obj . _id + "-progress" )
. classList . remove ( "progress-bar-animated" ) ;
document
. getElementById ( "msg-" + obj . _id + "-progress" )
. classList . remove ( "bg-danger" ) ;
document
. getElementById ( "msg-" + obj . _id + "-progress" )
. classList . add ( "bg-primary" ) ;
document . getElementById ( "msg-" + obj . _id + "-progress" ) . innerHTML = "" ;
} else {
document
. getElementById ( "msg-" + obj . _id + "-progress" )
. classList . add ( "progress-bar-striped" ) ;
document
. getElementById ( "msg-" + obj . _id + "-progress" )
. classList . add ( "progress-bar-animated" ) ;
2022-03-24 19:49:13 +00:00
}
2023-02-11 21:49:07 +00:00
if ( obj . status == "failed" ) {
//document.getElementById('msg-' + obj._id + '-progress').classList.remove("progress-bar-striped");
document
. getElementById ( "msg-" + obj . _id + "-progress" )
. classList . remove ( "progress-bar-animated" ) ;
document
. getElementById ( "msg-" + obj . _id + "-progress" )
. classList . remove ( "bg-primary" ) ;
document
. getElementById ( "msg-" + obj . _id + "-progress" )
. classList . add ( "bg-danger" ) ;
2022-03-24 19:49:13 +00:00
}
2023-02-11 21:49:07 +00:00
//document.getElementById(id).className = message_class;
}
2023-02-19 02:02:13 +00:00
//Delete message event listener
if (
document . getElementById ( "del-msg-" + obj . _id ) &&
! document
. getElementById ( "del-msg-" + obj . _id )
. hasAttribute ( "listenerOnClick" )
) {
// set Attribute to determine if we already created an EventListener for this element
document
. getElementById ( "del-msg-" + obj . _id )
. setAttribute ( "listenerOnClick" , "true" ) ;
document
. getElementById ( "del-msg-" + obj . _id )
. addEventListener ( "click" , ( ) => {
db . get ( obj . _id , {
attachments : true ,
} )
. then ( function ( doc ) {
db . remove ( doc . _id , doc . _rev , function ( err ) {
if ( err ) console . log ( "Error removing item " + err ) ;
} )
} )
. catch ( function ( err ) {
console . log ( err ) ;
} )
document . getElementById ( "msg-" + obj . _id ) . remove ( ) ;
document . getElementById ( "msg-" + obj . _id + "-control-area" ) . remove ( ) ;
console . log ( "Removed message " + obj . _id . toString ( ) ) ;
} )
//scrollMessagesToBottom();
} ;
2023-02-11 21:49:07 +00:00
// CREATE SAVE TO FOLDER EVENT LISTENER
if (
document . getElementById ( "save-file-msg-" + obj . _id ) &&
! document
. getElementById ( "save-file-msg-" + obj . _id )
. hasAttribute ( "listenerOnClick" )
) {
// set Attribute to determine if we already created an EventListener for this element
document
. getElementById ( "save-file-msg-" + obj . _id )
. setAttribute ( "listenerOnClick" , "true" ) ;
document
. getElementById ( "save-file-msg-" + obj . _id )
. addEventListener ( "click" , ( ) => {
saveFileToFolder ( obj . _id ) ;
} ) ;
}
// CREATE RESEND MSG EVENT LISTENER
// check if element exists and if we already created NOT created an event listener
if (
document . getElementById ( "retransmit-msg-" + obj . _id ) &&
! document
. getElementById ( "retransmit-msg-" + obj . _id )
. hasAttribute ( "listenerOnClick" )
) {
// set Attribute to determine if we already created an EventListener for this element
document
. getElementById ( "retransmit-msg-" + obj . _id )
. setAttribute ( "listenerOnClick" , "true" ) ;
document
. getElementById ( "retransmit-msg-" + obj . _id )
. addEventListener ( "click" , ( ) => {
db . get ( obj . _id , {
attachments : true ,
} )
. then ( function ( doc ) {
// handle doc
console . log ( doc ) ;
var filename = Object . keys ( obj . _attachments ) [ 0 ] ;
var filetype = filename . content _type ;
console . log ( filename ) ;
console . log ( filetype ) ;
var file = obj . _attachments [ filename ] . data ;
console . log ( file ) ;
console . log ( Object . keys ( obj . _attachments ) [ 0 ] . data ) ;
//var file = atob(obj._attachments[filename]["data"])
db . getAttachment ( obj . _id , filename ) . then ( function ( data ) {
console . log ( data ) ;
//Rewrote this part to use buffers to ensure encoding is corect -- n1qm
var binaryString = atob _FD ( data ) ;
console . log ( binaryString ) ;
var data _with _attachment =
doc . timestamp +
split _char +
doc . msg +
split _char +
filename +
split _char +
filetype +
split _char +
binaryString ;
let Data = {
command : "send_message" ,
dxcallsign : doc . dxcallsign ,
mode : 255 ,
frames : 1 ,
data : data _with _attachment ,
checksum : doc . checksum ,
uuid : doc . uuid ,
} ;
console . log ( Data ) ;
ipcRenderer . send ( "run-tnc-command" , Data ) ;
} ) ;
/ *
2022-12-08 19:21:44 +00:00
// convert blob data to binary string
blobUtil . blobToBinaryString ( data ) . then ( function ( binaryString ) {
2022-12-09 09:22:03 +00:00
console . log ( binaryString )
2022-12-08 19:21:44 +00:00
} ) . catch ( function ( err ) {
// error
console . log ( err ) ;
2022-12-09 09:22:03 +00:00
binaryString = blobUtil . arrayBufferToBinaryString ( data ) ;
2022-12-09 10:24:39 +00:00
} ) . then ( function ( ) {
2022-12-08 19:21:44 +00:00
2022-12-09 09:22:03 +00:00
console . log ( binaryString )
2022-12-27 08:53:21 +00:00
console . log ( binaryString . length )
2022-12-28 11:27:09 +00:00
var data _with _attachment = doc . timestamp + split _char + utf8 . encode ( doc . msg ) + split _char + filename + split _char + filetype + split _char + binaryString ;
2022-12-09 09:22:03 +00:00
let Data = {
command : "send_message" ,
dxcallsign : doc . dxcallsign ,
mode : 255 ,
frames : 1 ,
data : data _with _attachment ,
checksum : doc . checksum ,
uuid : doc . uuid
} ;
console . log ( Data )
ipcRenderer . send ( 'run-tnc-command' , Data ) ;
2022-04-06 08:15:14 +00:00
2022-12-09 09:22:03 +00:00
} ) ;
2022-03-27 19:04:04 +00:00
} ) ;
2023-02-04 17:12:15 +00:00
* /
2023-02-11 21:49:07 +00:00
} )
. catch ( function ( err ) {
console . log ( err ) ;
} ) ;
} ) ;
}
//window.location = window.location
2022-06-07 09:31:59 +00:00
2023-02-11 21:49:07 +00:00
// scroll to bottom on new message
scrollMessagesToBottom ( ) ;
} ;
2022-03-14 19:21:15 +00:00
2022-03-27 19:04:04 +00:00
function saveFileToFolder ( id ) {
2023-02-11 21:49:07 +00:00
db . get ( id , {
attachments : true ,
} )
. then ( function ( obj ) {
console . log ( obj ) ;
console . log ( Object . keys ( obj . _attachments ) [ 0 ] . content _type ) ;
var filename = Object . keys ( obj . _attachments ) [ 0 ] ;
var filetype = filename . content _type ;
var file = filename . data ;
console . log ( file ) ;
console . log ( filename . data ) ;
db . getAttachment ( id , filename )
. then ( function ( data ) {
// handle result
console . log ( data . length ) ;
//data = new Blob([data.buffer], { type: 'image/png' } /* (1) */)
console . log ( data ) ;
// we need to encode data because of error "an object could not be cloned"
let Data = {
file : data ,
filename : filename ,
filetype : filetype ,
} ;
console . log ( Data ) ;
ipcRenderer . send ( "save-file-to-folder" , Data ) ;
} )
. catch ( function ( err ) {
console . log ( err ) ;
return false ;
2022-03-29 20:24:35 +00:00
} ) ;
2023-02-11 21:49:07 +00:00
} )
. catch ( function ( err ) {
console . log ( err ) ;
2022-03-24 19:49:13 +00:00
} ) ;
}
2022-04-07 09:19:29 +00:00
2022-11-11 14:39:24 +00:00
// function for setting an ICON to the corresponding state
2022-04-07 09:19:29 +00:00
function get _icon _for _state ( state ) {
2023-02-11 21:49:07 +00:00
if ( state == "transmit" ) {
var status _icon = '<i class="bi bi-check" style="font-size:1rem;"></i>' ;
} else if ( state == "transmitting" ) {
//var status_icon = '<i class="bi bi-arrow-left-right" style="font-size:0.8rem;"></i>';
var status _icon = `
2022-06-09 12:11:39 +00:00
< i class = "spinner-border ms-auto" style = "width: 0.8rem; height: 0.8rem;" role = "status" aria - hidden = "true" > < / i >
` ;
2023-02-11 21:49:07 +00:00
} else if ( state == "failed" ) {
var status _icon =
'<i class="bi bi-exclamation-circle" style="font-size:1rem;"></i>' ;
} else if ( state == "transmitted" ) {
var status _icon = '<i class="bi bi-check-all" style="font-size:1rem;"></i>' ;
} else {
var status _icon = '<i class="bi bi-question" style="font-size:1rem;"></i>' ;
}
return status _icon ;
2022-06-15 12:34:17 +00:00
}
2022-06-07 09:31:59 +00:00
2023-02-11 21:49:07 +00:00
update _chat _obj _by _uuid = function ( uuid ) {
db . get ( uuid , {
attachments : true ,
} )
. then ( function ( doc ) {
update _chat ( doc ) ;
//return doc
} )
. catch ( function ( err ) {
console . log ( err ) ;
2022-06-07 09:31:59 +00:00
} ) ;
2023-02-11 21:49:07 +00:00
} ;
2022-06-07 09:31:59 +00:00
2023-02-11 21:49:07 +00:00
add _obj _to _database = function ( obj ) {
db . put ( {
_id : obj . uuid ,
timestamp : parseInt ( obj . timestamp ) ,
uuid : obj . uuid ,
dxcallsign : obj . dxcallsign ,
dxgrid : obj . dxgrid ,
msg : obj . msg ,
checksum : obj . checksum ,
type : obj . type ,
command : obj . command ,
status : obj . status ,
snr : obj . snr ,
_attachments : {
[ obj . filename ] : {
content _type : obj . filetype ,
data : obj . file ,
} ,
} ,
} )
. then ( function ( response ) {
console . log ( "new database entry" ) ;
console . log ( response ) ;
} )
. catch ( function ( err ) {
console . log ( err ) ;
2022-06-07 09:31:59 +00:00
} ) ;
2023-02-11 21:49:07 +00:00
} ;
2022-09-05 12:03:10 +00:00
// Scroll to bottom of message-container
function scrollMessagesToBottom ( ) {
2023-02-11 21:49:07 +00:00
var messageBody = document . getElementById ( "message-container" ) ;
messageBody . scrollTop = messageBody . scrollHeight - messageBody . clientHeight ;
2022-12-09 09:22:03 +00:00
}
2022-12-27 21:57:54 +00:00
2022-12-27 22:30:15 +00:00
// CRC CHECKSUMS
2022-12-27 21:57:54 +00:00
// https://stackoverflow.com/a/50579690
// crc32 calculation
//console.log(crc32('abc'));
2022-12-27 22:30:15 +00:00
//var crc32=function(r){for(var a,o=[],c=0;c<256;c++){a=c;for(var f=0;f<8;f++)a=1&a?3988292384^a>>>1:a>>>1;o[c]=a}for(var n=-1,t=0;t<r.length;t++)n=n>>>8^o[255&(n^r.charCodeAt(t))];return(-1^n)>>>0};
2022-12-27 21:57:54 +00:00
//console.log(crc32('abc').toString(16).toUpperCase()); // hex
2022-12-27 22:30:15 +00:00
2023-02-11 21:49:07 +00:00
var makeCRCTable = function ( ) {
var c ;
var crcTable = [ ] ;
for ( var n = 0 ; n < 256 ; n ++ ) {
c = n ;
for ( var k = 0 ; k < 8 ; k ++ ) {
c = c & 1 ? 0xedb88320 ^ ( c >>> 1 ) : c >>> 1 ;
2022-12-27 22:30:15 +00:00
}
2023-02-11 21:49:07 +00:00
crcTable [ n ] = c ;
}
return crcTable ;
} ;
2022-12-27 22:30:15 +00:00
2023-02-11 21:49:07 +00:00
var crc32 = function ( str ) {
var crcTable = window . crcTable || ( window . crcTable = makeCRCTable ( ) ) ;
var crc = 0 ^ - 1 ;
2022-12-27 22:30:15 +00:00
2023-02-11 21:49:07 +00:00
for ( var i = 0 ; i < str . length ; i ++ ) {
crc = ( crc >>> 8 ) ^ crcTable [ ( crc ^ str . charCodeAt ( i ) ) & 0xff ] ;
}
2022-12-27 22:30:15 +00:00
2023-02-11 21:49:07 +00:00
return ( crc ^ - 1 ) >>> 0 ;
2023-02-05 03:26:44 +00:00
} ;
/ * *
* Binary to ASCII replacement
* @ param { string } data in normal / usual utf - 8 format
* @ returns base64 encoded string
* /
2023-02-11 21:49:07 +00:00
function btoa _FD ( data ) {
return Buffer . from ( data , "utf-8" ) . toString ( "base64" ) ;
2023-02-05 03:26:44 +00:00
}
/ * *
* ASCII to Binary replacement
* @ param { string } data in base64 encoding
* @ returns utf - 8 normal / usual string
* /
2023-02-11 21:49:07 +00:00
function atob _FD ( data ) {
return Buffer . from ( data , "base64" ) . toString ( "utf-8" ) ;
}