#Include "TextLib" as TextLib #Const COOKIE_LOGLEVEL_ERROR 0 #Const COOKIE_LOGLEVEL_WARN 1 #Const COOKIE_LOGLEVEL_DEBUG 2 declare Integer Cookie_LogLevel; declare Integer _Cookie_SessionStart; Void _Cookie_CalcSessionStart() { if (_Cookie_SessionStart == 0) { _Cookie_SessionStart = Time_Timestamp() - CurrentTime / 1000; } } Boolean _Cookie_IsValid(Text _Ident) { _Cookie_CalcSessionStart(); declare persistent Text[Text] _Cookiejar for Page; declare persistent Integer[Text] _CookieTimeouts for Page; declare persistent Integer[Text] _CookieTimes for Page; declare Integer now = Time_Timestamp(); if (_Cookiejar.existskey(_Ident)) { if (now < _CookieTimeouts[_Ident]) return True; if (_CookieTimeouts[_Ident] == 0) return _CookieTimes[_Ident] == _Cookie_SessionStart; return False; } return False; } Void _Cookie_HasRightType(Text _Ident, Text _Type) { declare persistent Text[Text] _CookieTypes for Page; if (!_CookieTypes.existskey(_Ident)) _CookieTypes[_Ident] = "Text"; if (_CookieTypes[_Ident] != _Type && Cookie_LogLevel >= COOKIE_LOGLEVEL_WARN) log("[WARN][Cookie] Cookie '" ^ _Ident ^ "' was saved with type " ^ _CookieTypes[_Ident] ^ ", requested was " ^ _Type ^ "."); } Boolean Cookie_Exists(Text _Ident) { return _Cookie_IsValid(_Ident); } Text Cookie(Text _Ident) { _Cookie_CalcSessionStart(); declare persistent Text[Text] _Cookiejar for Page; if (_Cookie_IsValid(_Ident)) return _Cookiejar[_Ident]; if (Cookie_LogLevel == COOKIE_LOGLEVEL_DEBUG) log("[DEBUG][Cookie] Cookie '" ^ _Ident ^ "' is not set."); return ""; } Text CookieT(Text _Ident) { _Cookie_HasRightType(_Ident, "Text"); return Cookie(_Ident); } Real CookieR(Text _Ident) { _Cookie_HasRightType(_Ident, "Real"); return TextLib::ToReal(Cookie(_Ident)); } Integer CookieI(Text _Ident) { _Cookie_HasRightType(_Ident, "Integer"); return TextLib::ToInteger(Cookie(_Ident)); } Boolean CookieB(Text _Ident) { _Cookie_HasRightType(_Ident, "Boolean"); return Cookie(_Ident) == "True"; } Int3 CookieI3(Text _Ident) { _Cookie_HasRightType(_Ident, "Int3"); declare Text c = Cookie(_Ident); declare Text[] temp = TextLib::Split(", ", TextLib::SubString(c, 1, TextLib::Length(c) - 2)); temp.add("0"); temp.add("0"); temp.add("0"); return ; } Vec3 CookieV3(Text _Ident) { _Cookie_HasRightType(_Ident, "Vec3"); declare Text c = Cookie(_Ident); declare Text[] temp = TextLib::Split(", ", TextLib::SubString(c, 1, TextLib::Length(c) - 2)); temp.add("0"); temp.add("0"); temp.add("0"); return ; } Void Cookie(Text _Ident, Text _Value, Integer _Timeout) { _Cookie_CalcSessionStart(); declare persistent Text[Text] _Cookiejar for Page; declare persistent Text[Text] _CookieTypes for Page; declare persistent Integer[Text] _CookieTimes for Page; declare persistent Integer[Text] _CookieTimeouts for Page; declare Integer timeout = 0; if (_Timeout != 0) timeout = _Timeout; _CookieTimeouts[_Ident] = timeout; _CookieTimes[_Ident] = _Cookie_SessionStart; _Cookiejar[_Ident] = _Value; if (Cookie_LogLevel == COOKIE_LOGLEVEL_DEBUG) { declare Text logTime; if (_Timeout == 0) logTime = "' for the current session."; else logTime = "' until " ^ Time_Date(TIME_DATE_COOKIE ^ "."); if (_Timeout < 0 || _Timeout < Time_Timestamp()) log("[DEBUG][Cookie] Unset Cookie '" ^ _Ident ^ "'."); else log("[DEBUG][Cookie] Set Cookie '" ^ _Ident ^ logTime); } } Void Cookie(Text _Ident, Boolean _Value, Integer _Timeout) { declare persistent Text[Text] _CookieTypes for Page; _CookieTypes[_Ident] = "Boolean"; Cookie(_Ident, TextLib::ToText(_Value), _Timeout); } Void Cookie(Text _Ident, Integer _Value, Integer _Timeout) { declare persistent Text[Text] _CookieTypes for Page; _CookieTypes[_Ident] = "Integer"; Cookie(_Ident, TextLib::ToText(_Value), _Timeout); } Void Cookie(Text _Ident, Real _Value, Integer _Timeout) { declare persistent Text[Text] _CookieTypes for Page; _CookieTypes[_Ident] = "Real"; Cookie(_Ident, TextLib::ToText(_Value), _Timeout); } Void Cookie(Text _Ident, Int3 _Value, Integer _Timeout) { declare persistent Text[Text] _CookieTypes for Page; _CookieTypes[_Ident] = "Int3"; Cookie(_Ident, TextLib::ToText(_Value), _Timeout); } Void Cookie(Text _Ident, Vec3 _Value, Integer _Timeout) { declare persistent Text[Text] _CookieTypes for Page; _CookieTypes[_Ident] = "Vec3"; Cookie(_Ident, TextLib::ToText(_Value), _Timeout); }