Source: ServerWallet/TwisterDirectMessages.js

var inherits = require('inherits');

var TwisterResource = require('../TwisterResource.js');

/**
 * Describes the direct messages between an {@link TwisterAccount} and an {@link TwisterUser}
 * @class
 */
TwisterDirectMessages = function (walletusername,name,scope) {
    
	this._hasParentUser = true;
	
	this._walletusername = walletusername;
	
    TwisterResource.call(this,name,scope);
    
    this._latestId = -1;
    this._messages = {};
    
    this._type = "directmessages";

}

inherits(TwisterDirectMessages,TwisterResource);

TwisterDirectMessages.prototype.flatten = function () {

    var flatData = TwisterResource.prototype.flatten.call(this);
    
    var flatMessages = [];
    
    for (var id in this._messages){
		
        flatMessages.push(this.flattenMessage(this._messages[id]));
		
    }
    
    flatData.messages = flatMessages;
    flatData.latestId  = this._latestId;  
    flatData.walletusername  = this._walletusername;    
    
    return flatData;

}

TwisterDirectMessages.prototype.inflate = function (flatData) {
    
    var TwisterPost = require('../TwisterPost.js');
    
    TwisterResource.prototype.inflate.call(this,flatData);
    
    this._latestId = flatData.latestId;
    this._walletusername = flatData.walletusername;
    
    for(var i = 0; i < flatData.messages.length; i++){
        
        this._messages[messages.id]=this.inflateMessage(flatData.messages[i]);
    
    }

}

TwisterDirectMessages.prototype.flattenMessage = function (msg) {

	var flatMsg = {};
	
	flatMsg.id=msg.getId();
	flatMsg.time=msg.getTimestamp();
	flatMsg.text=msg.getContent();
	flatMsg.fromMe=msg.getFromMe();
	
	return flatMsg;

}

TwisterDirectMessages.prototype.inflateMessage = function (msg) {

	if (msg.fromMe) {
		msg.sender = this._walletusername;
		msg.receiver = this._name;		
	} else {
		msg.sender = this._name;	
		msg.receiver = this._walletusername;
	}
	
	var thisDirectMessages = this;
	
	msg.getId = function () {return this.id};
	msg.getContent = function () {return this.text};
	msg.getSender = function () {return this.sender};
	msg.getReceiver = function () {return this.sender};
	msg.getTimestamp = function () {return this.time};
	msg.doPreviousMessage = function (cbfunc) { thisDirectMessages._doMessage(this.id-1,cbfunc) };
	
	return msg;

}

TwisterDirectMessages.prototype._do =  function (cbfunc) {
    
    this._doMessage(this._latestId,cbfunc);
    
}

TwisterDirectMessages.prototype._queryAndDo = function (cbfunc) {
    	
    var thisResource = this;
        
	thisResource.RPC("getdirectmsgs", [ thisResource._walletusername , 30 , [{username: this._name}] ], function(res) {
            		
			//console.log(res[thisResource._name]);
		
			if (res[thisResource._name].length>0) {

				for (var i = 0; i<res[thisResource._name].length; i++) {

					thisResource._cacheMessage(res[thisResource._name][i],function(newmsg){

						if ( newmsg.getId() > thisResource._latestId ) {

							thisResource._latestId = newpost.getId();
							thisResource._lastUpdate = Date.now()/1000;

						}

					});

				}
				
				thisResource._do(cbfunc);

			} 

		}, function(ret) {

			thisResource._handleError(ret);

		}
					 
	);
 
        
}

TwisterDirectMessages.prototype._cacheMessage =  function (msg,cbfunc) {
	
    var Twister = this._scope;
        
    var thisResource = this;
    
    var newid = msg.id;
    
    if( !( newid in thisResource._messages) ) {

        var TwisterDirectMsg = require('../TwisterPost.js');

        var newmsg = thisResource.inflateMessage(msg);

        thisResource._messages[newmsg.getId()] = newmsg;
        
        if ( thisResource._latestId<newmsg.getId() ) {
        
            thisResource._latestId=newmsg.getId();
        
        }
        
        if (cbfunc) {
            
            cbfunc(newmsg);

        }
        
    }

}

TwisterDirectMessages.prototype._doMessage = function (id,cbfunc, querySettings) {

    var Twister = this._scope;
    
    if (id && id>0) {

        if (id in this._messages){
            
            cbfunc(this._messages[id])
            
        } else {
            
            var thisResource = this;
			         
			thisResource._updateInProgress = true;
			
            thisResource.RPC("getspamposts", [ 30 , id ], function(res) {
            		
					if (res.length>0) {

						for (var i = 0; i<res.length; i++) {

							thisResource._cacheMessage(res[i]);

						}

						cbfunc(thisResource._messages[id])

					} 
				
					thisResource._updateInProgress = false;

				}, querySettings
			);
            
        }
        
    }
    
};

TwisterDirectMessages.prototype._doUntil = function (cbfunc, querySettings) {

	this._checkQueryAndDo(function doUntil(message){
	
		var retVal = cbfunc(message);
		
		if( message.getId()!=1 && retVal!==false ) { 
			
			message.doPreviousMessage(doUntil, querySettings); 
			
		}
	
	}, querySettings);
	
}

module.exports = TwisterDirectMessages;