@@ -64,11 +64,12 @@
64 64 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
@ sdonotcall BOOLEAN, -- true for Do Not Call
65 65 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
@ sdigest BOOLEAN, -- true for daily digests only
66 66 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
@ ssub TEXT, -- baseline subscriptions
67 67 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
@ sctime INTDATE, -- When this entry was created. unixtime
68 68 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
@ mtime INTDATE, -- Last change. unixtime
69 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- @ smip TEXT -- IP address of last change
69 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ @ smip TEXT, -- IP address of last change
70 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ @ lastContact INT -- Last contact. days since 1970
70 71 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
@ );
71 72 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
@ CREATE INDEX repository.subscriberUname
72 73 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
@ ON subscriber(suname) WHERE suname IS NOT NULL;
73 74 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
@
74 75 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
@ DROP TABLE IF EXISTS repository.pending_alert;
@@ -83,28 +84,33 @@
83 84 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
@ sentSep BOOLEAN DEFAULT false, -- individual alert sent
84 85 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
@ sentDigest BOOLEAN DEFAULT false, -- digest alert sent
85 86 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
@ sentMod BOOLEAN DEFAULT false -- pending moderation alert sent
86 87 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
@ ) WITHOUT ROWID;
87 88 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
@
89 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ @ -- Obsolete table. No longer used.
88 90 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
@ DROP TABLE IF EXISTS repository.alert_bounce;
89 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- @ -- Record bounced emails. If too many bounces are received within
90 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- @ -- some defined time range, then cancel the subscription. Older
91 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- @ -- entries are periodically purged.
92 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- @ --
93 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- @ CREATE TABLE repository.alert_bounce(
94 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- @ subscriberId INTEGER, -- to whom the email was sent.
95 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- @ sendTime INTEGER, -- seconds since 1970 when email was sent
96 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- @ rcvdTime INTEGER -- seconds since 1970 when bounce was received
97 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- @ );
98 91 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
;
99 92 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
100 93 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/*
101 94 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** Return true if the email notification tables exist.
102 95 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*/
103 96 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int alert_tables_exist(void){
104 97 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
return db_table_exists("repository", "subscriber");
105 98 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
99 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
100 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /*
101 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** Record the fact that user zUser has made contact with the repository.
102 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** This resets the subscription timeout on that user.
103 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ */
104 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ void alert_user_contact(const char *zUser){
105 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( db_table_has_column("repository","subscriber","lastContact") ){
106 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ db_multi_exec(
107 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ "UPDATE subscriber SET lastContact=now()/86400 WHERE suname=%Q",
108 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ zUser
109 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ );
110 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
111 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
106 112 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
107 113 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/*
108 114 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** Make sure the table needed for email notification exist in the repository.
109 115 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
**
110 116 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** If the bOnlyIfEnabled option is true, then tables are only created
@@ -116,16 +122,27 @@
116 122 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
&& fossil_strcmp(db_get("email-send-method",0),"off")==0
117 123 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
){
118 124 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
return; /* Don't create table for disabled email */
119 125 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
120 126 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
db_exec_sql(zAlertInit);
121 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }else if( !db_table_has_column("repository","pending_alert","sentMod") ){
122 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- db_multi_exec(
123 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- "ALTER TABLE repository.pending_alert"
124 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- " ADD COLUMN sentMod BOOLEAN DEFAULT false;"
125 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- );
127 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ return;
126 128 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
129 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( db_table_has_column("repository","subscriber","lastContact") ){
130 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ return;
131 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
132 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ db_multi_exec(
133 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ "DROP TABLE IF EXISTS repository.alert_bounde;\n"
134 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ "ALTER TABLE repository.subscriber ADD COLUMN lastContact INT;\n"
135 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ "UPDATE subscriber SET lastContact=mtime/86400;"
136 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ );
137 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( db_table_has_column("repository","pending_alert","sentMod") ){
138 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ return;
139 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
140 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ db_multi_exec(
141 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ "ALTER TABLE repository.pending_alert"
142 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ " ADD COLUMN sentMod BOOLEAN DEFAULT false;"
143 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ );
127 144 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
128 145 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
129 146 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/*
130 147 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** Enable triggers that automatically populate the pending_alert
131 148 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** table.
@@ -1391,12 +1408,12 @@
1391 1408 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( g.perm.RdWiki && PB("sw") ) ssub[nsub++] = 'w';
1392 1409 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( g.perm.RdForum && PB("sx") ) ssub[nsub++] = 'x';
1393 1410 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
ssub[nsub] = 0;
1394 1411 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
zCode = db_text(0,
1395 1412 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
"INSERT INTO subscriber(semail,suname,"
1396 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- " sverified,sdonotcall,sdigest,ssub,sctime,mtime,smip)"
1397 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- "VALUES(%Q,%Q,%d,0,%d,%Q,now(),now(),%Q)"
1413 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ " sverified,sdonotcall,sdigest,ssub,sctime,mtime,smip,lastContact)"
1414 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ "VALUES(%Q,%Q,%d,0,%d,%Q,now(),now(),%Q,now()/86400)"
1398 1415 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
"RETURNING hex(subscriberCode);",
1399 1416 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/* semail */ zEAddr,
1400 1417 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/* suname */ suname,
1401 1418 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/* sverified */ needCaptcha==0,
1402 1419 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/* sdigest */ PB("di"),
@@ -1641,10 +1658,11 @@
1641 1658 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int eErr = 0; /* Type of error */
1642 1659 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
char *zErr = 0; /* Error message text */
1643 1660 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int sid = 0; /* Subscriber ID */
1644 1661 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int nName; /* Length of zName in bytes */
1645 1662 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
char *zHalfCode; /* prefix of subscriberCode */
1663 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int keepAlive = 0; /* True to update the last contact time */
1646 1664 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
1647 1665 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
db_begin_transaction();
1648 1666 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( alert_webpages_disabled() ){
1649 1667 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
db_commit_transaction();
1650 1668 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
return;
@@ -1665,10 +1683,11 @@
1665 1683 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
sid = db_int(0,
1666 1684 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
"SELECT CASE WHEN hex(subscriberCode) LIKE (%Q||'%%')"
1667 1685 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
" THEN subscriberId ELSE 0 END"
1668 1686 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
" FROM subscriber WHERE subscriberCode>=hextoblob(%Q)"
1669 1687 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
" LIMIT 1", zName, zName);
1688 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( sid ) keepAlive = 1;
1670 1689 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
1671 1690 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( sid==0 && isLogin ){
1672 1691 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
sid = db_int(0, "SELECT subscriberId FROM subscriber"
1673 1692 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
" WHERE suname=%Q", g.zLogin);
1674 1693 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
@@ -1697,11 +1716,12 @@
1697 1716 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
blob_init(&update, "UPDATE subscriber SET", -1);
1698 1717 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
blob_append_sql(&update,
1699 1718 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
" sdonotcall=%d,"
1700 1719 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
" sdigest=%d,"
1701 1720 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
" ssub=%Q,"
1702 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- " mtime=strftime('%%s','now'),"
1721 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ " mtime=now(),"
1722 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ " lastContact=now()/86400,"
1703 1723 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
" smip=%Q",
1704 1724 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
sdonotcall,
1705 1725 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
sdigest,
1706 1726 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
ssub,
1707 1727 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
g.zIpAddr
@@ -1727,10 +1747,15 @@
1727 1747 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( eErr==0 ){
1728 1748 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
db_exec_sql(blob_str(&update));
1729 1749 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
ssub = 0;
1730 1750 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
1731 1751 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
blob_reset(&update);
1752 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }else if( keepAlive ){
1753 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ db_multi_exec(
1754 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ "UPDATE subscriber SET lastContact=now()/86400"
1755 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ " WHERE subscriberId=%d", sid
1756 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ );
1732 1757 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
1733 1758 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( P("delete")!=0 && cgi_csrf_safe(1) ){
1734 1759 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( !PB("dodelete") ){
1735 1760 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
eErr = 9;
1736 1761 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
zErr = mprintf("Select this checkbox and press \"Unsubscribe\" again to"
@@ -2111,11 +2136,11 @@
2111 2136 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
nPending = db_int(0, "SELECT count(*) FROM subscriber WHERE NOT sverified");
2112 2137 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( nPending>0 && P("purge") && cgi_csrf_safe(0) ){
2113 2138 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int nNewPending;
2114 2139 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
db_multi_exec(
2115 2140 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
"DELETE FROM subscriber"
2116 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- " WHERE NOT sverified AND mtime<0+strftime('%%s','now','-1 day')"
2141 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ " WHERE NOT sverified AND mtime<now()-86400"
2117 2142 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
);
2118 2143 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
nNewPending = db_int(0, "SELECT count(*) FROM subscriber"
2119 2144 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
" WHERE NOT sverified");
2120 2145 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
nDel = nPending - nNewPending;
2121 2146 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
nPending = nNewPending;
@@ -2122,11 +2147,11 @@
2122 2147 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
nTotal -= nDel;
2123 2148 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
2124 2149 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( nPending>0 ){
2125 2150 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
@ <h1>%,d(nTotal) Subscribers, %,d(nPending) Pending</h1>
2126 2151 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( nDel==0 && 0<db_int(0,"SELECT count(*) FROM subscriber"
2127 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- " WHERE NOT sverified AND mtime<0+strftime('%%s','now','-1 day')")
2152 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ " WHERE NOT sverified AND mtime<now()-86400")
2128 2153 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
){
2129 2154 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
style_submenu_element("Purge Pending","subscribers?purge");
2130 2155 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
2131 2156 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}else{
2132 2157 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
@ <h1>%,d(nTotal) Subscribers</h1>
@@ -2142,11 +2167,12 @@
2142 2167 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
" suname," /* 3 */
2143 2168 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
" sverified," /* 4 */
2144 2169 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
" sdigest," /* 5 */
2145 2170 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
" mtime," /* 6 */
2146 2171 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
" date(sctime,'unixepoch')," /* 7 */
2147 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- " (SELECT uid FROM user WHERE login=subscriber.suname)" /* 8 */
2172 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ " (SELECT uid FROM user WHERE login=subscriber.suname)," /* 8 */
2173 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ " coalesce(lastContact,mtime/86400)" /* 9 */
2148 2174 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
" FROM subscriber"
2149 2175 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
);
2150 2176 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( P("only")!=0 ){
2151 2177 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
blob_append_sql(&sql, " WHERE ssub LIKE '%%%q%%'", P("only"));
2152 2178 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
style_submenu_element("Show All","%R/subscribers");
@@ -2153,27 +2179,30 @@
2153 2179 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
2154 2180 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
blob_append_sql(&sql," ORDER BY mtime DESC");
2155 2181 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
db_prepare_blob(&q, &sql);
2156 2182 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
iNow = time(0);
2157 2183 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
@ <table border='1' class='sortable' \
2158 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- @ data-init-sort='6' data-column-types='tttttKt'>
2184 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ @ data-init-sort='6' data-column-types='tttttKKt'>
2159 2185 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
@ <thead>
2160 2186 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
@ <tr>
2161 2187 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
@ <th>Email
2162 2188 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
@ <th>Events
2163 2189 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
@ <th>Digest-Only?
2164 2190 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
@ <th>User
2165 2191 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
@ <th>Verified?
2166 2192 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
@ <th>Last change
2193 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ @ <th>Last contact
2167 2194 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
@ <th>Created
2168 2195 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
@ </tr>
2169 2196 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
@ </thead><tbody>
2170 2197 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
while( db_step(&q)==SQLITE_ROW ){
2171 2198 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
sqlite3_int64 iMtime = db_column_int64(&q, 6);
2172 2199 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
double rAge = (iNow - iMtime)/86400.0;
2173 2200 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int uid = db_column_int(&q, 8);
2174 2201 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
const char *zUname = db_column_text(&q, 3);
2202 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ sqlite3_int64 iContact = db_column_int64(&q, 9);
2203 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ double rContact = (iNow/86400) - iContact;
2175 2204 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
@ <tr>
2176 2205 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
@ <td><a href='%R/alerts?sid=%d(db_column_int(&q,0))'>\
2177 2206 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
@ %h(db_column_text(&q,1))</a></td>
2178 2207 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
@ <td>%h(db_column_text(&q,2))</td>
2179 2208 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
@ <td>%s(db_column_int(&q,5)?"digest":"")</td>
@@ -2182,10 +2211,11 @@
2182 2211 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}else{
2183 2212 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
@ <td>%h(zUname)</td>
2184 2213 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
2185 2214 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
@ <td>%s(db_column_int(&q,4)?"yes":"pending")</td>
2186 2215 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
@ <td data-sortkey='%010llx(iMtime)'>%z(human_readable_age(rAge))</td>
2216 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ @ <td data-sortkey='%010llx(iContact)'>%z(human_readable_age(rContact))</td>
2187 2217 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
@ <td>%h(db_column_text(&q,7))</td>
2188 2218 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
@ </tr>
2189 2219 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
2190 2220 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
@ </tbody></table>
2191 2221 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
db_finalize(&q);
2192 2222 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!