Theme for twister
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

209 lines
7.1 KiB

11 years ago
// twister_newmsgs.js
// 2013 Miguel Freitas
//
// Periodically check for new mentions and private messages (DMs)
// Update UI counters in top bar. Load/save state to localStorage.
// --- mentions ---
var _knownMentions = {}
var _lastMentionTime = 0;
var _newMentions = 0;
var _lastLocalMentionId = -1;
11 years ago
var PURGE_OLD_MENTIONS_TIMEOUT = 3600 * 24 * 30; // one month
// process a mention received to check if it is really new
function processMention(user, mentionTime, data) {
var key = user + ";" + mentionTime;
var curTime = new Date().getTime() / 1000;
if( mentionTime > curTime + 3600 ) {
console.log("mention from the future will be ignored");
} else {
var newMentionsUpdated = false;
11 years ago
if( !(key in _knownMentions) ) {
// mention must be somewhat recent compared to last known one to be considered new
if( mentionTime + 3600 > _lastMentionTime ) {
_newMentions++;
newMentionsUpdated = true;
11 years ago
_lastMentionTime = mentionTime;
}
_knownMentions[key] = {mentionTime:mentionTime, data:data};
purgeOldMentions();
saveMentionsToStorage();
}
if(newMentionsUpdated){
$.MAL.soundNotifyMentions();
}
11 years ago
}
}
function purgeOldMentions() {
for( var key in _knownMentions ) {
if( _knownMentions.hasOwnProperty(key) ) {
if( !_knownMentions[key].mentionTime || !_knownMentions[key].data ||
_knownMentions[key].mentionTime + PURGE_OLD_MENTIONS_TIMEOUT < _lastMentionTime ) {
delete _knownMentions[key];
}
}
}
}
function saveMentionsToStorage() {
var ns=$.initNamespaceStorage(defaultScreenName);
ns.localStorage.set("knownMentions", _knownMentions);
ns.localStorage.set("lastMentionTime", _lastMentionTime);
ns.localStorage.set("newMentions", _newMentions);
ns.localStorage.set("lastLocalMentionId",_lastLocalMentionId);
11 years ago
}
function loadMentionsFromStorage() {
var ns=$.initNamespaceStorage(defaultScreenName);
if( ns.localStorage.isSet("knownMentions") )
_knownMentions = ns.localStorage.get("knownMentions");
if( ns.localStorage.isSet("lastMentionTime") )
_lastMentionTime = ns.localStorage.get("lastMentionTime");
if( ns.localStorage.isSet("newMentions") )
_newMentions = ns.localStorage.get("newMentions");
if( ns.localStorage.isSet("lastLocalMentionId") )
_lastLocalMentionId = ns.localStorage.get("lastLocalMentionId");
11 years ago
}
function requestMentionsCount() {
// first: getmentions from torrents we follow
twisterRpc("getmentions", [defaultScreenName, 100, {"since_id":_lastLocalMentionId}],
function(args, data) {
if( data ) {
for( var i = 0; i < data.length; i++ ) {
_lastLocalMentionId = Math.max(_lastLocalMentionId, data[i]["id"]);
var userpost = data[i]["userpost"];
processMention( userpost["n"], userpost["time"], data[i]);
}
$.MAL.updateNewMentionsUI(_newMentions);
}
}, null,
function(req, ret) {console.log("getmentions API requires twister-core > 0.9.27");}, null);
// second: get mentions from dht (not-following)
11 years ago
dhtget( defaultScreenName, "mention", "m",
function(args, data) {
if( data ) {
for( var i = 0; i < data.length; i++ ) {
var userpost = data[i]["userpost"];
processMention( userpost["n"], userpost["time"], data[i]);
}
$.MAL.updateNewMentionsUI(_newMentions);
}
}, {},
[10000,2500,6]); // use extended timeout parameters (requires twister_core >= 0.9.14)
11 years ago
}
function resetMentionsCount() {
_newMentions = 0;
saveMentionsToStorage();
$.MAL.updateNewMentionsUI(_newMentions);
}
function initMentionsCount() {
// polling mentions is a temporary solution
loadMentionsFromStorage();
$.MAL.updateNewMentionsUI(_newMentions);
requestMentionsCount();
setInterval("requestMentionsCount()", 10000);
}
function getMentionsData() {
mentions = []
for( var key in _knownMentions ) {
if( _knownMentions.hasOwnProperty(key) && _knownMentions[key].data ) {
mentions.push(_knownMentions[key].data);
}
}
return mentions;
}
// --- direct messages ---
var _lastDMIdPerUser = {};
var _newDMsPerUser = {};
function saveDMsToStorage() {
var ns=$.initNamespaceStorage(defaultScreenName);
ns.localStorage.set("lastDMIdPerUser", _lastDMIdPerUser);
ns.localStorage.set("newDMsPerUser", _newDMsPerUser);
}
function loadDMsFromStorage() {
var ns=$.initNamespaceStorage(defaultScreenName);
if( ns.localStorage.isSet("lastDMIdPerUser") )
_lastDMIdPerUser = ns.localStorage.get("lastDMIdPerUser");
if( ns.localStorage.isSet("newDMsPerUser") )
_newDMsPerUser = ns.localStorage.get("newDMsPerUser");
}
function requestDMsCount() {
var followList = [];
for( var i = 0; i < followingUsers.length; i++ ) {
followList.push({username:followingUsers[i]});
}
twisterRpc("getdirectmsgs", [defaultScreenName, 1, followList],
function(req, dmUsers) {
var updated = false;
for( var u in dmUsers ) {
if( dmUsers.hasOwnProperty(u) ) {
var dmData = dmUsers[u][0];
if( (u in _lastDMIdPerUser) && (u in _newDMsPerUser) ) {
if( dmData.id != _lastDMIdPerUser[u] ) {
_newDMsPerUser[u] += (dmData.id - _lastDMIdPerUser[u]);
updated = true;
}
} else {
_newDMsPerUser[u] = dmData.id+1;
updated = true;
}
_lastDMIdPerUser[u] = dmData.id;
}
}
if( updated ) {
saveDMsToStorage();
$.MAL.updateNewDMsUI(getNewDMsCount());
}
}, null,
function(req, ret) {console.log("ajax error:" + ret);}, null);
}
function getNewDMsCount() {
var newDMs = 0, key, reslt;
11 years ago
for( var key in _newDMsPerUser ) {
if( _newDMsPerUser.hasOwnProperty(key) ) {
newDMs += _newDMsPerUser[key];
}
}
for (key in _newDMsPerUser){if(_newDMsPerUser[key] * 1)reslt = true};
if(newDMs > 0 && reslt) $.MAL.soundNotifyDM();
11 years ago
return newDMs;
}
function resetNewDMsCountForUser(user, lastId) {
_newDMsPerUser[user] = 0;
_lastDMIdPerUser[user] = lastId;
saveDMsToStorage();
$.MAL.updateNewDMsUI(getNewDMsCount());
}
function initDMsCount() {
loadDMsFromStorage();
$.MAL.updateNewDMsUI(getNewDMsCount());
requestDMsCount();
//polling not needed: processNewPostsConfirmation will call requestDMsCount.
//setInterval("requestDMsCount()", 5000);
}
function newmsgsChangedUser() {
_knownMentions = {}
_lastMentionTime = 0;
_newMentions = 0;
}