344 lines
10 KiB
HTML
344 lines
10 KiB
HTML
<%
|
|
local util = require "luci.util"
|
|
local fs = require "nixio.fs"
|
|
local sys = require "luci.sys"
|
|
local http = require "luci.http"
|
|
local dispatcher = require "luci.dispatcher"
|
|
local uci = require "luci.model.uci".cursor()
|
|
|
|
local devv = tostring(uci:get("sms_tool", "general", "readport"))
|
|
local smsmem = tostring(uci:get("sms_tool", "general", "storage"))
|
|
local sms = tostring(luci.sys.exec("sms_tool -s" .. smsmem .. " -d " .. devv .. " -f '%Y-%m-%d %H:%M' -j recv 2>/dev/null"))
|
|
local smsmer = tostring(uci:get("sms_tool", "general", "mergesms"))
|
|
local directx = tostring(uci:get("sms_tool", "general", "direction"))
|
|
local algox = tostring(uci:get("sms_tool", "general", "algorithm"))
|
|
local smscuta = string.sub (sms, 8)
|
|
local smscut = smscuta:sub(1, #smscuta - 2)
|
|
local statusb = luci.util.exec("sms_tool -s" .. smsmem .. " -d ".. devv .. " status")
|
|
local all = statusb:match('[^: ]+$')
|
|
local location = ""
|
|
|
|
local l = string.sub (statusb, 15, 16)
|
|
if l == "SM" then
|
|
location = translate("SIM card")
|
|
end
|
|
if l == "ME" then
|
|
location = translate("Modem memory")
|
|
end
|
|
-%>
|
|
|
|
<%+header%>
|
|
|
|
<!--
|
|
-- Copyright 2020-2023 Rafał Wabik (IceG) - From eko.one.pl forum
|
|
-- Licensed to the GNU General Public License v3.0.
|
|
-->
|
|
|
|
<style>
|
|
|
|
table {
|
|
border-collapse: collapse;
|
|
width: 100%;
|
|
}
|
|
|
|
th, td {
|
|
border-bottom: 1px solid var(--border-color-medium);
|
|
font-size: 12px;
|
|
padding: 10px;
|
|
text-align: justify;
|
|
display: table-cell;
|
|
vertical-align: top;
|
|
}
|
|
|
|
td input[type="checkbox"] {
|
|
float: left;
|
|
margin: 0 auto;
|
|
width: 40%;
|
|
}
|
|
|
|
tr:nth-child(odd) {background-color: var(--background-color-medium)}
|
|
|
|
</style>
|
|
|
|
<script type="text/javascript">//<![CDATA[
|
|
|
|
window.onload = function readSMS() {
|
|
|
|
XHR.get('<%=luci.dispatcher.build_url("admin", "modem", "sms", "readsim")%>', null,
|
|
function(x, sim)
|
|
{
|
|
var vn = parseInt(sim.use) || 0;
|
|
var mn = parseInt(sim.all) || 100;
|
|
var pc = Math.floor((100 / mn) * vn);
|
|
document.getElementById('usse').innerHTML=sim.use + " / " + sim.all + " " + '('+ pc + '%)';
|
|
}
|
|
);
|
|
|
|
var msgm = <%=smsmer%>;
|
|
var algo = "<%=algox%>";
|
|
var direct = "<%=directx%>";
|
|
|
|
if ( msgm == "0" ) {
|
|
|
|
var array = <%=smscut%>;
|
|
var sortedData = array .sort((function (a, b) { return new Date(b.timestamp) - new Date(a.timestamp) }));
|
|
var table = document.getElementById("smsTable");
|
|
var data = JSON.stringify(sortedData);
|
|
var json = JSON.parse(data);
|
|
|
|
var x = <%=all%>;
|
|
for (var d = 0; d < json.length; d++) {
|
|
|
|
row = table.insertRow(-1);
|
|
var cell1 = row.insertCell(0);
|
|
var cell2 = row.insertCell(0);
|
|
var cell3 = row.insertCell(0);
|
|
var cell4 = row.insertCell(0);
|
|
cell4.innerHTML = "<input type='checkbox' name='smsn' id="+"btn"+json[d].index+" /><img src='<%=resource%>/icons/delsms.png'>"
|
|
cell3.innerHTML = json[d].sender;
|
|
cell2.innerHTML = json[d].timestamp;
|
|
cell1.innerHTML = json[d].content;
|
|
}
|
|
}
|
|
|
|
if ( msgm == "1" ) {
|
|
|
|
if (algo == 'Simple') {
|
|
|
|
var array = <%=smscut%>;
|
|
var sortedData = array .sort((function (a, b) { return new Date(b.timestamp) - new Date(a.timestamp) }));
|
|
var table = document.getElementById("smsTable");
|
|
|
|
var MergeMySMS = sortedData;
|
|
result = [];
|
|
|
|
MergeMySMS.forEach(function (o) {
|
|
if (!this[o.sender]) {
|
|
this[o.sender] = { index: o.index, sender: o.sender, timestamp: o.timestamp, part: o.part, total: o.total, content: o.content };
|
|
result.push(this[o.sender]);
|
|
return;
|
|
}
|
|
if (this[o.sender].total == o.total && this[o.sender].part > 0) {
|
|
this[o.sender].content += o.content;
|
|
this[o.sender].index += '-' + o.index;}
|
|
else {
|
|
this[o.sender] = { index: o.index, sender: o.sender, timestamp: o.timestamp, part: o.part, total: o.total, content: o.content };
|
|
result.push(this[o.sender]);
|
|
return;
|
|
}
|
|
}, Object.create(null));
|
|
|
|
var data = JSON.stringify(result);
|
|
var json = JSON.parse(data);
|
|
|
|
}
|
|
|
|
if (algo == 'Advanced') {
|
|
|
|
var array = <%=smscut%>;
|
|
var table = document.getElementById("smsTable");
|
|
|
|
result = [];
|
|
|
|
switch (direct) {
|
|
case 'Start':
|
|
var Data = array.sort((a, b) => {
|
|
if (a.timestamp === b.timestamp && a.sender === b.sender) {
|
|
return a.part - b.part;
|
|
} else if (a.timestamp === b.timestamp) {
|
|
return a.sender - b.sender;
|
|
} else {
|
|
return a.timestamp.localeCompare(b.timestamp);
|
|
}
|
|
});
|
|
break;
|
|
case 'End':
|
|
var Data = array.sort((a, b) => {
|
|
if (a.timestamp === b.timestamp && a.sender === b.sender) {
|
|
return b.part - a.part;
|
|
} else if (a.timestamp === b.timestamp) {
|
|
return a.sender - b.sender;
|
|
} else {
|
|
return a.timestamp.localeCompare(b.timestamp);
|
|
}
|
|
});
|
|
break;
|
|
default:
|
|
}
|
|
|
|
var SortedSMS = Data.sort((function (a, b) { return new Date(b.timestamp) - new Date(a.timestamp) }));
|
|
|
|
var combinedjson = {};
|
|
|
|
for (const parts of SortedSMS) {
|
|
const { sender, timestamp, total, content, index } = parts;
|
|
const key = `${sender}-${timestamp}-${total}`;
|
|
if (combinedjson[key]) {
|
|
combinedjson[key].content += content;
|
|
combinedjson[key].index += '-'+index;
|
|
} else {
|
|
combinedjson[key] = { sender, timestamp, total, content, index };
|
|
}
|
|
}
|
|
var result = Object.values(combinedjson);
|
|
|
|
var data = JSON.stringify(result);
|
|
var json = JSON.parse(data);
|
|
|
|
}
|
|
|
|
var x = <%=all%>;
|
|
for (var d = 0; d < json.length; d++) {
|
|
|
|
row = table.insertRow(-1);
|
|
var cell1 = row.insertCell(0);
|
|
var cell2 = row.insertCell(0);
|
|
var cell3 = row.insertCell(0);
|
|
var cell4 = row.insertCell(0);
|
|
cell4.innerHTML = "<input type='checkbox' name='smsn' id="+"btn"+json[d].index+" /><img src='<%=resource%>/icons/delsms.png'>"
|
|
cell3.innerHTML = json[d].sender;
|
|
cell2.innerHTML = json[d].timestamp;
|
|
cell1.innerHTML = json[d].content;
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
function refreshSMS() {
|
|
window.location.reload();
|
|
}
|
|
|
|
function toggle(source) {
|
|
var checkboxes = document.querySelectorAll('input[type="checkbox"]');
|
|
for (var i = 0; i < checkboxes.length; i++) {
|
|
if (checkboxes[i] != source)
|
|
checkboxes[i].checked = source.checked;
|
|
}
|
|
}
|
|
|
|
|
|
function delete_new()
|
|
{
|
|
if (document.querySelectorAll('input[name="smsn"]:checked').length === document.querySelectorAll('input[name="smsn"]').length) {
|
|
|
|
if (confirm("<%:Delete all the messages?%>")) {
|
|
var rowCount = smsTable.rows.length;
|
|
document.getElementById('usse').innerHTML = "0" + " / " + <%=all%>;
|
|
for (var i = rowCount - 1; i > 0; i--) {
|
|
smsTable.deleteRow(i);}
|
|
|
|
XHR.get('<%=luci.dispatcher.build_url("admin", "modem", "sms", "delete_all")%>/' , null,
|
|
|
|
function()
|
|
{
|
|
document.getElementById('usse').innerHTML = "0" + " / " + <%=all%> + " " + '(0%)';
|
|
}
|
|
);
|
|
|
|
XHR.get('<%=luci.dispatcher.build_url("admin", "modem", "sms", "countsms")%>/' , null,
|
|
|
|
function()
|
|
{
|
|
}
|
|
);
|
|
return false;
|
|
}
|
|
|
|
|
|
} else {
|
|
|
|
if (document.querySelectorAll('input[name="smsn"]:checked').length == 0){
|
|
alert('<%:Please select the message(s) to be deleted%>');
|
|
} else {
|
|
|
|
var items = document.getElementsByName("smsn");
|
|
var selectedItems = "";
|
|
for (var i = 0; i < items.length; i++) {
|
|
if (items[i].type == "checkbox" && items[i].checked == true) selectedItems += items[i].id + "\n";
|
|
}
|
|
smsindex = selectedItems.replace(/\s/g, '');
|
|
|
|
if (confirm("<%:Delete selected message(s)?%>")) {
|
|
|
|
XHR.get('<%=luci.dispatcher.build_url("admin", "modem", "sms", "delete_one")%>/' + smsindex, null,
|
|
|
|
function()
|
|
{
|
|
var table = document.getElementById("smsTable");
|
|
var index = 1;
|
|
while (index < table.rows.length) {
|
|
|
|
var input = table.rows[index].cells[0].children[0];
|
|
if (input && input.checked) {
|
|
table.deleteRow(index);
|
|
}
|
|
else {
|
|
index++;
|
|
}
|
|
}
|
|
|
|
XHR.get('<%=luci.dispatcher.build_url("admin", "modem", "sms", "readsim")%>', null,
|
|
function(x, sim)
|
|
{
|
|
var vn = parseInt(sim.use) || 0;
|
|
var mn = parseInt(sim.all) || 100;
|
|
var pc = Math.floor((100 / mn) * vn);
|
|
document.getElementById('usse').innerHTML=sim.use + " / " + sim.all + " " + '('+ pc + '%)';
|
|
|
|
}
|
|
);
|
|
}
|
|
|
|
);
|
|
|
|
XHR.get('<%=luci.dispatcher.build_url("admin", "modem", "sms", "countsms")%>/' , null,
|
|
|
|
function()
|
|
{
|
|
}
|
|
);
|
|
return false;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
//]]></script>
|
|
|
|
<h2><%:SMS Messages%></h2>
|
|
<div class="cbi-map-descr"><%:Web UI for receiveling messages via sms_tool. More information about the sms-tool on the%> <a href="https://eko.one.pl/?p=openwrt-sms_tool" target="_blank"><%:eko.one.pl forum%></a>.</div>
|
|
<p></p>
|
|
<h4><%:Received Messages%></h4>
|
|
<div class="table" width="100%">
|
|
<div class="tr"><div class="td left" width="33%"><%:Messages store in%>:</div><div class="td left"><%=location%></div></div>
|
|
<div class="tr"><div class="td left" width="33%"><%:Messages (Inbox / Maximum)%>:</div><div class="td left" id="usse"></div></div>
|
|
</div>
|
|
|
|
<table id="smsTable" width="100%" class="table">
|
|
<tr class="tr cbi-rowstyle-2">
|
|
|
|
<td class="td left" width="7%"><input type='checkbox' id='allcheck' onclick='toggle(this);'/></td>
|
|
<td class="td left" width="11%"><strong><%:From%></strong></td>
|
|
<td class="td left" width="15%"><strong><%:Received%></strong></td>
|
|
<td class="td center" width="66%" ><strong><%:Message%></strong></td>
|
|
|
|
</tr>
|
|
</table>
|
|
|
|
<div class="table" width="100%" >
|
|
<div class="tr cbi-rowstyle-2">
|
|
|
|
<div class="td right" style="width:100%;">
|
|
<div style="float: left;"></div>
|
|
<input type="button" id="delbtn" class="btn cbi-button cbi-button-neutral" value="<%:Refresh SMS%>" onclick="refreshSMS()" /> <input type="button" id="delabtn" class="btn cbi-button cbi-button-neutral" value="<%:Delete message(s)%>" onclick="delete_new()" />
|
|
|
|
</div>
|
|
</div>
|
|
|
|
<%+footer%>
|
|
|