136 lines
2.5 KiB
Haxe
136 lines
2.5 KiB
Haxe
package sugoi.db;
|
|
import sys.db.Types;
|
|
import db.User;
|
|
#if neko
|
|
import neko.Web;
|
|
#else
|
|
import php.Web;
|
|
#end
|
|
|
|
@:id(sid)
|
|
@:index(uid,unique)
|
|
class Session extends sys.db.Object {
|
|
|
|
public var sid : SString<32>;
|
|
public var ip : SString<15>;
|
|
public var lang : SString<2>;
|
|
public var messages : SData<Array<{ error : Bool, text : String }>>;
|
|
public var lastTime : SDateTime;
|
|
public var createTime : SDateTime;
|
|
|
|
#if neko
|
|
public var sdata : SNekoSerialized;
|
|
#else
|
|
public var sdata : SText;
|
|
#end
|
|
|
|
@:skip public var data : Dynamic;
|
|
|
|
//public var uid : SNull<SInt>;
|
|
@:relation(uid) public var user : SNull<db.User>;
|
|
|
|
|
|
|
|
public function new() {
|
|
super();
|
|
messages = [];
|
|
data = {};
|
|
|
|
}
|
|
|
|
/**
|
|
* Stores a message in session
|
|
*/
|
|
public function addMessage( text : String, ?error=false ) {
|
|
messages.push({ error : error, text : text });
|
|
}
|
|
|
|
|
|
public function setUser( u : User ):Void {
|
|
|
|
//remove any previous session for this user
|
|
manager.delete($uid==u.id);
|
|
|
|
lang = u.lang;
|
|
user = u;
|
|
update();
|
|
|
|
App.current.user = u;
|
|
}
|
|
|
|
public override function update() {
|
|
#if neko
|
|
sdata = neko.Lib.serialize(data);
|
|
#else
|
|
sdata = haxe.Serializer.run(data);
|
|
#end
|
|
lastTime = Date.now();
|
|
super.update();
|
|
}
|
|
|
|
private static function get( sid:String ):Session {
|
|
if ( sid == null ) return null;
|
|
|
|
var s = manager.get(sid,true);
|
|
if ( s == null ) return null;
|
|
try {
|
|
#if neko
|
|
s.data = neko.Lib.localUnserialize(s.sdata);
|
|
#else
|
|
s.data = haxe.Unserializer.run(s.sdata);
|
|
#end
|
|
}catch (e:Dynamic) {
|
|
s.data = null;
|
|
}
|
|
|
|
return s;
|
|
}
|
|
|
|
|
|
public static function init( sids : Array<String> ) {
|
|
for( sid in sids ) {
|
|
var s = get(sid);
|
|
if( s != null ) return s;
|
|
}
|
|
var ip = Web.getClientIP();
|
|
var s = new Session();
|
|
s.ip = ip;
|
|
s.createTime = Date.now();
|
|
s.lastTime = Date.now();
|
|
|
|
s.sid = generateId();
|
|
var count = 20;
|
|
while( try { s.insert(); false; } catch( e : Dynamic ) true ) {
|
|
s.sid = generateId();
|
|
// prevent infinite loop in SQL error
|
|
if( count-- == 0 ) {
|
|
s.insert();
|
|
break;
|
|
}
|
|
}
|
|
|
|
return s;
|
|
}
|
|
|
|
/**
|
|
* Generate a random 32 chars string
|
|
*/
|
|
public static var S = "abcdefjhijklmnopqrstuvwxyABCDEFJHIJKLMNOPQRSTUVWXYZ0123456789";
|
|
public static function generateId():String {
|
|
|
|
var id = "";
|
|
for ( x in 0...32 ) {
|
|
id += S.substr(Std.random(S.length),1);
|
|
}
|
|
return id;
|
|
}
|
|
|
|
/**
|
|
* Delete sessions older than 1 month
|
|
*/
|
|
public static function clean() {
|
|
manager.delete($lastTime < DateTools.delta(Date.now(),-1000.0*60*60*24*30));
|
|
}
|
|
|
|
}
|