mirror of
https://github.com/ClassiCube/ClassiCube.git
synced 2025-09-17 03:25:14 -04:00
more work on updates menu
This commit is contained in:
parent
09127b69e3
commit
4be56bf54c
@ -6,6 +6,7 @@
|
|||||||
#include "Game.h"
|
#include "Game.h"
|
||||||
#include "Drawer2D.h"
|
#include "Drawer2D.h"
|
||||||
#include "ExtMath.h"
|
#include "ExtMath.h"
|
||||||
|
#include "Platform.h"
|
||||||
|
|
||||||
/*########################################################################################################################*
|
/*########################################################################################################################*
|
||||||
*---------------------------------------------------------Screen base-----------------------------------------------------*
|
*---------------------------------------------------------Screen base-----------------------------------------------------*
|
||||||
@ -995,14 +996,29 @@ static void UpdatesScreen_Draw(struct LScreen* s) {
|
|||||||
|
|
||||||
static void UpdatesScreen_Format(struct LLabel* lbl, const char* prefix, TimeMS time) {
|
static void UpdatesScreen_Format(struct LLabel* lbl, const char* prefix, TimeMS time) {
|
||||||
String str; char buffer[STRING_SIZE];
|
String str; char buffer[STRING_SIZE];
|
||||||
String_InitArray(str, buffer);
|
TimeMS now;
|
||||||
|
|
||||||
|
String_InitArray(str, buffer);
|
||||||
String_AppendConst(&str, prefix);
|
String_AppendConst(&str, prefix);
|
||||||
|
|
||||||
if (!time) {
|
if (!time) {
|
||||||
String_AppendConst(&str, "&cCheck failed");
|
String_AppendConst(&str, "&cCheck failed");
|
||||||
} else {
|
} else {
|
||||||
// do something here..
|
now = DateTime_CurrentUTC_MS();
|
||||||
String_AppendConst(&str, " ago");
|
int delta = (int)(now - time) / 1000;
|
||||||
|
|
||||||
|
if (delta < SECS_PER_MIN) {
|
||||||
|
String_Format1(&str, "%i seconds ago", &delta);
|
||||||
|
} else if (delta < SECS_PER_HOUR) {
|
||||||
|
delta /= SECS_PER_MIN;
|
||||||
|
String_Format1(&str, "%i minutes ago", &delta);
|
||||||
|
} else if (delta < SECS_PER_DAY) {
|
||||||
|
delta /= SECS_PER_HOUR;
|
||||||
|
String_Format1(&str, "%i hours ago", &delta);
|
||||||
|
} else {
|
||||||
|
delta /= SECS_PER_DAY;
|
||||||
|
String_Format1(&str, "%i days ago", &delta);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
LLabel_SetText(lbl, &str);
|
LLabel_SetText(lbl, &str);
|
||||||
}
|
}
|
||||||
@ -1042,11 +1058,6 @@ static void UpdatesScreen_Get(bool release, bool d3d9) {
|
|||||||
//UpdateStatus();
|
//UpdateStatus();
|
||||||
}
|
}
|
||||||
|
|
||||||
void Init() {
|
|
||||||
//CheckUpdateTask_Run();
|
|
||||||
//FIX ALL THE COMMENTED OUT // CODE
|
|
||||||
}
|
|
||||||
|
|
||||||
static void UpdatesScreen_CheckTick(struct UpdatesScreen* s) {
|
static void UpdatesScreen_CheckTick(struct UpdatesScreen* s) {
|
||||||
if (!CheckUpdateTask.Base.Working) return;
|
if (!CheckUpdateTask.Base.Working) return;
|
||||||
LWebTask_Tick(&CheckUpdateTask.Base);
|
LWebTask_Tick(&CheckUpdateTask.Base);
|
||||||
@ -1101,10 +1112,12 @@ static void UpdatesScreen_DevD3D9(void* w, int x, int y) { UpdatesScreen_Get(f
|
|||||||
static void UpdatesScreen_DevOpenGL(void* w, int x, int y) { UpdatesScreen_Get(false, false); }
|
static void UpdatesScreen_DevOpenGL(void* w, int x, int y) { UpdatesScreen_Get(false, false); }
|
||||||
|
|
||||||
static void UpdatesScreen_Init(struct LScreen* s_) {
|
static void UpdatesScreen_Init(struct LScreen* s_) {
|
||||||
|
static String exeName = String_FromConst(GAME_EXE_NAME);
|
||||||
struct UpdatesScreen* s = (struct UpdatesScreen*)s_;
|
struct UpdatesScreen* s = (struct UpdatesScreen*)s_;
|
||||||
//DateTime writeTime = Platform.FileGetModifiedTime("ClassicalSharp.exe");
|
TimeMS buildTime;
|
||||||
|
ReturnCode res;
|
||||||
|
|
||||||
if (s->NumWidgets) return;
|
if (s->NumWidgets) { CheckUpdateTask_Run(); return; }
|
||||||
s->Widgets = s->_widgets;
|
s->Widgets = s->_widgets;
|
||||||
LScreen_Label(s_, &s->LblYour, "Your build: (unknown)");
|
LScreen_Label(s_, &s->LblYour, "Your build: (unknown)");
|
||||||
|
|
||||||
@ -1130,6 +1143,14 @@ static void UpdatesScreen_Init(struct LScreen* s_) {
|
|||||||
if (CheckUpdateTask.Base.Completed && CheckUpdateTask.Base.Success) {
|
if (CheckUpdateTask.Base.Completed && CheckUpdateTask.Base.Success) {
|
||||||
UpdatesScreen_FormatBoth(s);
|
UpdatesScreen_FormatBoth(s);
|
||||||
}
|
}
|
||||||
|
CheckUpdateTask_Run();
|
||||||
|
|
||||||
|
res = File_GetModifiedTime(&exeName, &buildTime);
|
||||||
|
if (res) {
|
||||||
|
Launcher_ShowError(res, "getting build time");
|
||||||
|
} else {
|
||||||
|
UpdatesScreen_Format(&s->LblYour, "Your build: ", buildTime);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static void UpdatesScreen_Reposition(struct LScreen* s_) {
|
static void UpdatesScreen_Reposition(struct LScreen* s_) {
|
||||||
|
@ -434,7 +434,7 @@ ReturnCode Directory_Enum(const String* dirPath, void* obj, Directory_EnumCallba
|
|||||||
return Win_Return(res == ERROR_NO_MORE_FILES);
|
return Win_Return(res == ERROR_NO_MORE_FILES);
|
||||||
}
|
}
|
||||||
|
|
||||||
ReturnCode File_GetModifiedTime_MS(const String* path, TimeMS* time) {
|
ReturnCode File_GetModifiedTime(const String* path, TimeMS* time) {
|
||||||
FileHandle file;
|
FileHandle file;
|
||||||
ReturnCode res = File_Open(&file, path);
|
ReturnCode res = File_Open(&file, path);
|
||||||
if (res) return res;
|
if (res) return res;
|
||||||
@ -567,7 +567,7 @@ ReturnCode Directory_Enum(const String* dirPath, void* obj, Directory_EnumCallba
|
|||||||
return res;
|
return res;
|
||||||
}
|
}
|
||||||
|
|
||||||
ReturnCode File_GetModifiedTime_MS(const String* path, TimeMS* time) {
|
ReturnCode File_GetModifiedTime(const String* path, TimeMS* time) {
|
||||||
char str[600];
|
char str[600];
|
||||||
struct stat sb;
|
struct stat sb;
|
||||||
Platform_ConvertString(str, path);
|
Platform_ConvertString(str, path);
|
||||||
|
@ -120,7 +120,7 @@ ReturnCode Directory_Enum(const String* path, void* obj, Directory_EnumCallback
|
|||||||
/* Returns whether the given file exists. */
|
/* Returns whether the given file exists. */
|
||||||
bool File_Exists(const String* path);
|
bool File_Exists(const String* path);
|
||||||
/* Returns the last time the file was modified, as number of milliseconds since 1/1/0001 */
|
/* Returns the last time the file was modified, as number of milliseconds since 1/1/0001 */
|
||||||
ReturnCode File_GetModifiedTime_MS(const String* path, TimeMS* ms);
|
ReturnCode File_GetModifiedTime(const String* path, TimeMS* ms);
|
||||||
|
|
||||||
/* Attempts to create a new (or overwrite) file for writing. */
|
/* Attempts to create a new (or overwrite) file for writing. */
|
||||||
ReturnCode File_Create(FileHandle* file, const String* path);
|
ReturnCode File_Create(FileHandle* file, const String* path);
|
||||||
|
@ -1403,7 +1403,7 @@ static struct DisconnectScreen DisconnectScreen_Instance;
|
|||||||
static void DisconnectScreen_ReconnectMessage(struct DisconnectScreen* s, String* msg) {
|
static void DisconnectScreen_ReconnectMessage(struct DisconnectScreen* s, String* msg) {
|
||||||
if (s->CanReconnect) {
|
if (s->CanReconnect) {
|
||||||
int elapsedMS = (int)(DateTime_CurrentUTC_MS() - s->InitTime);
|
int elapsedMS = (int)(DateTime_CurrentUTC_MS() - s->InitTime);
|
||||||
int secsLeft = (DISCONNECT_DELAY_MS - elapsedMS) / DATETIME_MILLIS_PER_SEC;
|
int secsLeft = (DISCONNECT_DELAY_MS - elapsedMS) / MILLIS_PER_SEC;
|
||||||
|
|
||||||
if (secsLeft > 0) {
|
if (secsLeft > 0) {
|
||||||
String_Format1(msg, "Reconnect in %i", &secsLeft); return;
|
String_Format1(msg, "Reconnect in %i", &secsLeft); return;
|
||||||
@ -1417,7 +1417,7 @@ static void DisconnectScreen_UpdateDelayLeft(struct DisconnectScreen* s, double
|
|||||||
int elapsedMS, secsLeft;
|
int elapsedMS, secsLeft;
|
||||||
|
|
||||||
elapsedMS = (int)(DateTime_CurrentUTC_MS() - s->InitTime);
|
elapsedMS = (int)(DateTime_CurrentUTC_MS() - s->InitTime);
|
||||||
secsLeft = (DISCONNECT_DELAY_MS - elapsedMS) / DATETIME_MILLIS_PER_SEC;
|
secsLeft = (DISCONNECT_DELAY_MS - elapsedMS) / MILLIS_PER_SEC;
|
||||||
if (secsLeft < 0) secsLeft = 0;
|
if (secsLeft < 0) secsLeft = 0;
|
||||||
if (s->LastSecsLeft == secsLeft && s->Reconnect.Active == s->LastActive) return;
|
if (s->LastSecsLeft == secsLeft && s->Reconnect.Active == s->LastActive) return;
|
||||||
|
|
||||||
@ -1465,7 +1465,7 @@ static void DisconnectScreen_Init(void* screen) {
|
|||||||
game_limitMs = 1000 / 5.0f;
|
game_limitMs = 1000 / 5.0f;
|
||||||
|
|
||||||
s->InitTime = DateTime_CurrentUTC_MS();
|
s->InitTime = DateTime_CurrentUTC_MS();
|
||||||
s->LastSecsLeft = DISCONNECT_DELAY_MS / DATETIME_MILLIS_PER_SEC;
|
s->LastSecsLeft = DISCONNECT_DELAY_MS / MILLIS_PER_SEC;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void DisconnectScreen_Render(void* screen, double delta) {
|
static void DisconnectScreen_Render(void* screen, double delta) {
|
||||||
|
@ -572,7 +572,7 @@ void TextureCache_GetLastModified(const String* url, TimeMS* time) {
|
|||||||
String_InitArray(path, pathBuffer);
|
String_InitArray(path, pathBuffer);
|
||||||
TextureCache_MakePath(&path, url);
|
TextureCache_MakePath(&path, url);
|
||||||
|
|
||||||
res = File_GetModifiedTime_MS(&path, time);
|
res = File_GetModifiedTime(&path, time);
|
||||||
if (res) { Chat_LogError2(res, "getting last modified time of", url); *time = 0; }
|
if (res) { Chat_LogError2(res, "getting last modified time of", url); *time = 0; }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
30
src/Utils.c
30
src/Utils.c
@ -10,12 +10,6 @@
|
|||||||
/*########################################################################################################################*
|
/*########################################################################################################################*
|
||||||
*--------------------------------------------------------DateTime---------------------------------------------------------*
|
*--------------------------------------------------------DateTime---------------------------------------------------------*
|
||||||
*#########################################################################################################################*/
|
*#########################################################################################################################*/
|
||||||
#define DATETIME_SECONDS_PER_MINUTE 60
|
|
||||||
#define DATETIME_SECONDS_PER_HOUR (60 * 60)
|
|
||||||
#define DATETIME_SECONDS_PER_DAY (60 * 60 * 24)
|
|
||||||
#define DATETIME_MINUTES_PER_HOUR 60
|
|
||||||
#define DATETIME_HOURS_PER_DAY 24
|
|
||||||
#define DATETIME_MILLISECS_PER_DAY (1000 * 60 * 60 * 24)
|
|
||||||
|
|
||||||
#define DAYS_IN_400_YEARS 146097 /* (400*365) + 97 */
|
#define DAYS_IN_400_YEARS 146097 /* (400*365) + 97 */
|
||||||
static uint16_t DateTime_DaysTotal[13] = { 0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334, 365 };
|
static uint16_t DateTime_DaysTotal[13] = { 0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334, 365 };
|
||||||
@ -47,11 +41,11 @@ int DateTime_TotalDays(const struct DateTime* time) {
|
|||||||
TimeMS DateTime_TotalMs(const struct DateTime* time) {
|
TimeMS DateTime_TotalMs(const struct DateTime* time) {
|
||||||
int days = DateTime_TotalDays(time);
|
int days = DateTime_TotalDays(time);
|
||||||
uint64_t seconds =
|
uint64_t seconds =
|
||||||
(uint64_t)days * DATETIME_SECONDS_PER_DAY +
|
(uint64_t)days * SECS_PER_DAY +
|
||||||
time->Hour * DATETIME_SECONDS_PER_HOUR +
|
time->Hour * SECS_PER_HOUR +
|
||||||
time->Minute * DATETIME_SECONDS_PER_MINUTE +
|
time->Minute * SECS_PER_MIN +
|
||||||
time->Second;
|
time->Second;
|
||||||
return seconds * DATETIME_MILLIS_PER_SEC + time->Milli;
|
return seconds * MILLIS_PER_SEC + time->Milli;
|
||||||
}
|
}
|
||||||
|
|
||||||
void DateTime_FromTotalMs(struct DateTime* time, TimeMS ms) {
|
void DateTime_FromTotalMs(struct DateTime* time, TimeMS ms) {
|
||||||
@ -61,16 +55,16 @@ void DateTime_FromTotalMs(struct DateTime* time, TimeMS ms) {
|
|||||||
bool leap;
|
bool leap;
|
||||||
|
|
||||||
/* Work out time component for just this day */
|
/* Work out time component for just this day */
|
||||||
dayMS = (int)(ms % DATETIME_MILLISECS_PER_DAY);
|
dayMS = (int)(ms % MILLIS_PER_DAY);
|
||||||
time->Milli = dayMS % DATETIME_MILLIS_PER_SEC; dayMS /= DATETIME_MILLIS_PER_SEC;
|
time->Milli = dayMS % MILLIS_PER_SEC; dayMS /= MILLIS_PER_SEC;
|
||||||
time->Second = dayMS % DATETIME_SECONDS_PER_MINUTE; dayMS /= DATETIME_SECONDS_PER_MINUTE;
|
time->Second = dayMS % SECS_PER_MIN; dayMS /= SECS_PER_MIN;
|
||||||
time->Minute = dayMS % DATETIME_MINUTES_PER_HOUR; dayMS /= DATETIME_MINUTES_PER_HOUR;
|
time->Minute = dayMS % MINS_PER_HOUR; dayMS /= MINS_PER_HOUR;
|
||||||
time->Hour = dayMS % DATETIME_HOURS_PER_DAY; dayMS /= DATETIME_HOURS_PER_DAY;
|
time->Hour = dayMS % HOURS_PER_DAY; dayMS /= HOURS_PER_DAY;
|
||||||
|
|
||||||
/* Then work out day/month/year component (inverse TotalDays operation) */
|
/* Then work out day/month/year component (inverse TotalDays operation) */
|
||||||
/* Probably not the most efficient way of doing this. But it passes my tests at */
|
/* Probably not the most efficient way of doing this. But it passes my tests at */
|
||||||
/* https://gist.github.com/UnknownShadow200/30993c66464bb03ead01577f3ab2a653 */
|
/* https://gist.github.com/UnknownShadow200/30993c66464bb03ead01577f3ab2a653 */
|
||||||
days = (int)(ms / DATETIME_MILLISECS_PER_DAY);
|
days = (int)(ms / MILLIS_PER_DAY);
|
||||||
year = 1 + ((days / DAYS_IN_400_YEARS) * 400); days %= DAYS_IN_400_YEARS;
|
year = 1 + ((days / DAYS_IN_400_YEARS) * 400); days %= DAYS_IN_400_YEARS;
|
||||||
|
|
||||||
for (; ; year++) {
|
for (; ; year++) {
|
||||||
@ -94,8 +88,8 @@ void DateTime_FromTotalMs(struct DateTime* time, TimeMS ms) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void DateTime_HttpDate(TimeMS ms, String* str) {
|
void DateTime_HttpDate(TimeMS ms, String* str) {
|
||||||
static char* days_of_week[7] = { "Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun" };
|
static const char* days_of_week[7] = { "Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun" };
|
||||||
static char* month_names[13] = { NULL, "Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec" };
|
static const char* month_names[13] = { NULL, "Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec" };
|
||||||
struct DateTime t;
|
struct DateTime t;
|
||||||
int days;
|
int days;
|
||||||
|
|
||||||
|
@ -18,7 +18,14 @@ struct DateTime {
|
|||||||
int Milli; /* Milliseconds, ranges from 0 to 999 */
|
int Milli; /* Milliseconds, ranges from 0 to 999 */
|
||||||
};
|
};
|
||||||
|
|
||||||
#define DATETIME_MILLIS_PER_SEC 1000
|
#define MILLIS_PER_SEC 1000
|
||||||
|
#define SECS_PER_MIN 60
|
||||||
|
#define SECS_PER_HOUR (60 * 60)
|
||||||
|
#define SECS_PER_DAY (60 * 60 * 24)
|
||||||
|
#define MINS_PER_HOUR 60
|
||||||
|
#define HOURS_PER_DAY 24
|
||||||
|
#define MILLIS_PER_DAY (1000 * 60 * 60 * 24)
|
||||||
|
|
||||||
int DateTime_TotalDays(const struct DateTime* time);
|
int DateTime_TotalDays(const struct DateTime* time);
|
||||||
TimeMS DateTime_TotalMs(const struct DateTime* time);
|
TimeMS DateTime_TotalMs(const struct DateTime* time);
|
||||||
void DateTime_FromTotalMs(struct DateTime* time, TimeMS ms);
|
void DateTime_FromTotalMs(struct DateTime* time, TimeMS ms);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user