From 84196b1ef302166c8596d0147addfc10f53833cb Mon Sep 17 00:00:00 2001 From: Sebastian Wojtowicz Date: Tue, 15 Feb 2011 14:58:42 +0100 Subject: [PATCH] some little cleanup If /times is entered with no params it now shows last 5 times of server in general --- src/game/ddracecommands.h | 2 +- src/game/server/ddracecommands.cpp | 17 ++- src/game/server/score/sql_score.cpp | 203 ++++++++++++++++------------ src/game/server/score/sql_score.h | 1 + 4 files changed, 135 insertions(+), 88 deletions(-) diff --git a/src/game/ddracecommands.h b/src/game/ddracecommands.h index f626c274b..d4936edf7 100644 --- a/src/game/ddracecommands.h +++ b/src/game/ddracecommands.h @@ -57,7 +57,7 @@ CONSOLE_COMMAND("rules", "", CFGFLAG_SERVER, ConRules, this, "Shows the server r CONSOLE_COMMAND("team", "?i", CFGFLAG_SERVER, ConJoinTeam, this, "Lets you join team i (shows your team if left blank)", -1) CONSOLE_COMMAND("top5", "?i", CFGFLAG_SERVER, ConTop5, this, "Shows five ranks of the ladder beginning with rank i (1 by default)", -1) #if defined(CONF_SQL) -CONSOLE_COMMAND("times", "?si", CFGFLAG_SERVER, ConTimes, this, "Shows last 5 times beginning with time i of player with name s (i = 1 by default)", -1) +CONSOLE_COMMAND("times", "?s?i", CFGFLAG_SERVER, ConTimes, this, "/times ?s?i shows last 5 times of the server or of a player beginning with name s starting with time i (i = 1 by default)", -1) #endif CONSOLE_COMMAND("showothers", "", CFGFLAG_SERVER, ConShowOthers, this, "Whether to showplayers from other teams or not (off by default)", -1) diff --git a/src/game/server/ddracecommands.cpp b/src/game/server/ddracecommands.cpp index 029394256..53a649fb7 100644 --- a/src/game/server/ddracecommands.cpp +++ b/src/game/server/ddracecommands.cpp @@ -767,11 +767,20 @@ void CGameContext::ConTimes(IConsole::IResult *pResult, void *pUserData, int Cli if(!pPlayer) return; - if(pResult->NumArguments() > 0 && pResult->NumArguments() < 3) + if(pResult->NumArguments() == 0) + { + pScore->ShowTimes(pPlayer->GetCID(),1); + return; + } + + else if(pResult->NumArguments() < 3) { if (pResult->NumArguments() == 1) { - pScore->ShowTimes(pPlayer->GetCID(), (str_comp(pResult->GetString(0), "me") == 0) ? pSelf->Server()->ClientName(ClientID) : pResult->GetString(0),1); + if(pResult->GetInteger(0) != 0) + pScore->ShowTimes(pPlayer->GetCID(),pResult->GetInteger(0)); + else + pScore->ShowTimes(pPlayer->GetCID(), (str_comp(pResult->GetString(0), "me") == 0) ? pSelf->Server()->ClientName(ClientID) : pResult->GetString(0),1); return; } else if (pResult->GetInteger(1) != 0) @@ -781,8 +790,8 @@ void CGameContext::ConTimes(IConsole::IResult *pResult, void *pUserData, int Cli } } - pSelf->Console()->PrintResponse(IConsole::OUTPUT_LEVEL_STANDARD, "info", "/times needs 1 or 2 parameter. 1. = name, 2. = start with number"); - pSelf->Console()->PrintResponse(IConsole::OUTPUT_LEVEL_STANDARD, "info", "Example: /times me, /times Hans, /times \"Papa Smurf\" 5"); + pSelf->Console()->PrintResponse(IConsole::OUTPUT_LEVEL_STANDARD, "info", "/times needs 0, 1 or 2 parameter. 1. = name, 2. = start number"); + pSelf->Console()->PrintResponse(IConsole::OUTPUT_LEVEL_STANDARD, "info", "Example: /times, /times me, /times Hans, /times \"Papa Smurf\" 5"); pSelf->Console()->PrintResponse(IConsole::OUTPUT_LEVEL_STANDARD, "info", "Bad: /times Papa Smurf 5 # Good: /times \"Papa Smurf\" 5 "); } } diff --git a/src/game/server/score/sql_score.cpp b/src/game/server/score/sql_score.cpp index 6e96c267f..0b634e03c 100644 --- a/src/game/server/score/sql_score.cpp +++ b/src/game/server/score/sql_score.cpp @@ -388,70 +388,6 @@ void CSqlScore::ShowRankThread(void *pUser) lock_release(gs_SqlLock); } -void CSqlScore::agoTimeToString(int agoTime, char agoString[]){ - char aBuf[20]; - int times[7] = { - 60 * 60 * 24 * 365 , - 60 * 60 * 24 * 30 , - 60 * 60 * 24 * 7, - 60 * 60 * 24 , - 60 * 60 , - 60 , - 1 - }; - char names[7][6] = { - "year", - "month", - "week", - "day", - "hour", - "min", - "sec" - }; - - int seconds = 0; - char name[6]; - int count = 0; - int i = 0; - - // finding biggest match - for(i = 0; i<7; i++){ - seconds = times[i]; - strcpy(name,names[i]); - - count = floor(double(agoTime/seconds)); - if(count != 0){ - break; - } - } - - if(count == 1){ - str_format(aBuf, sizeof(aBuf), "%d %s", 1 , name); - }else{ - str_format(aBuf, sizeof(aBuf), "%d %ss", count , name); - } - strcat(agoString,aBuf); - - if (i + 1 < 7) { - // getting second piece now - int seconds2 = times[i+1]; - char name2[6]; - strcpy(name2,names[i+1]); - - // add second piece if it's greater than 0 - int count2 = floor(double((agoTime - (seconds * count)) / seconds2)); - - if (count2 != 0) { - if(count2 == 1){ - str_format(aBuf, sizeof(aBuf), " and %d %s", 1 , name2); - }else{ - str_format(aBuf, sizeof(aBuf), " and %d %ss", count2 , name2); - } - strcat(agoString,aBuf); - } - } -} - void CSqlScore::ShowRank(int ClientID, const char* pName, bool Search) { CSqlScoreData *Tmp = new CSqlScoreData(); @@ -534,32 +470,54 @@ void CSqlScore::ShowTimesThread(void *pUser) strcpy(originalName,pData->m_aName); pData->m_pSqlData->ClearString(pData->m_aName); - // check sort methode char aBuf[512]; - str_format(aBuf, sizeof(aBuf), "SELECT Time, UNIX_TIMESTAMP(CURRENT_TIMESTAMP)-UNIX_TIMESTAMP(Timestamp) as Ago, UNIX_TIMESTAMP(Timestamp) as Stamp FROM %s_%s_race WHERE Name = '%s' ORDER BY Ago ASC LIMIT %d, 5;", pData->m_pSqlData->m_pPrefix, pData->m_pSqlData->m_aMap, pData->m_aName, pData->m_Num-1); + + if(pData->m_Search) // last 5 times of a player + str_format(aBuf, sizeof(aBuf), "SELECT Time, UNIX_TIMESTAMP(CURRENT_TIMESTAMP)-UNIX_TIMESTAMP(Timestamp) as Ago, UNIX_TIMESTAMP(Timestamp) as Stamp FROM %s_%s_race WHERE Name = '%s' ORDER BY Ago ASC LIMIT %d, 5;", pData->m_pSqlData->m_pPrefix, pData->m_pSqlData->m_aMap, pData->m_aName, pData->m_Num-1); + else // last 5 times of server + str_format(aBuf, sizeof(aBuf), "SELECT Name, Time, UNIX_TIMESTAMP(CURRENT_TIMESTAMP)-UNIX_TIMESTAMP(Timestamp) as Ago, UNIX_TIMESTAMP(Timestamp) as Stamp FROM %s_%s_race ORDER BY Ago ASC LIMIT %d, 5;", pData->m_pSqlData->m_pPrefix, pData->m_pSqlData->m_aMap, pData->m_Num-1); + pData->m_pSqlData->m_pResults = pData->m_pSqlData->m_pStatement->executeQuery(aBuf); // show top5 - pData->m_pSqlData->GameServer()->SendChatTarget(pData->m_ClientID, "--------- Last 5 Times ---------"); + if(pData->m_pSqlData->m_pResults->rowsCount() == 0){ + pData->m_pSqlData->GameServer()->SendChatTarget(pData->m_ClientID, "There are no times in the specified range"); + goto end; + } + + str_format(aBuf, sizeof(aBuf), "------------ Last Times No %d - %d ------------",pData->m_Num,pData->m_Num + pData->m_pSqlData->m_pResults->rowsCount() - 1); + pData->m_pSqlData->GameServer()->SendChatTarget(pData->m_ClientID, aBuf); + + float pTime = 0; + int pSince = 0; + int pStamp = 0; - float Time = 0; - int since = 0; - int stamp = 0; while(pData->m_pSqlData->m_pResults->next()) { - char agoString[40] = "\0"; - since = (int)pData->m_pSqlData->m_pResults->getInt("Ago"); - stamp = (int)pData->m_pSqlData->m_pResults->getInt("Stamp"); - Time = (float)pData->m_pSqlData->m_pResults->getDouble("Time"); - agoTimeToString(since,agoString); + char pAgoString[40] = "\0"; + pSince = (int)pData->m_pSqlData->m_pResults->getInt("Ago"); + pStamp = (int)pData->m_pSqlData->m_pResults->getInt("Stamp"); + pTime = (float)pData->m_pSqlData->m_pResults->getDouble("Time"); + + agoTimeToString(pSince,pAgoString); - if(stamp == 0) // stamp is 00:00:00 cause it's an old entry from old times where there where no stamps yet - str_format(aBuf, sizeof(aBuf), "Time: %d min %.2f sec, don't know how long ago", (int)(Time/60), Time-((int)Time/60*60)); - else - str_format(aBuf, sizeof(aBuf), "Time: %d min %.2f sec, %s ago", (int)(Time/60), Time-((int)Time/60*60),agoString); + if(pData->m_Search) // last 5 times of a player + { + if(pStamp == 0) // stamp is 00:00:00 cause it's an old entry from old times where there where no stamps yet + str_format(aBuf, sizeof(aBuf), "%d min %.2f sec, don't know how long ago", (int)(pTime/60), pTime-((int)pTime/60*60)); + else + str_format(aBuf, sizeof(aBuf), "%s ago, %d min %.2f sec", pAgoString,(int)(pTime/60), pTime-((int)pTime/60*60)); + } + else // last 5 times of the server + { + if(pStamp == 0) // stamp is 00:00:00 cause it's an old entry from old times where there where no stamps yet + str_format(aBuf, sizeof(aBuf), "%s, %d m %.2f s, don't know when", pData->m_pSqlData->m_pResults->getString("Name").c_str(), (int)(pTime/60), pTime-((int)pTime/60*60)); + else + str_format(aBuf, sizeof(aBuf), "%s, %s ago, %d m %.2f s", pData->m_pSqlData->m_pResults->getString("Name").c_str(), pAgoString, (int)(pTime/60), pTime-((int)pTime/60*60)); + } pData->m_pSqlData->GameServer()->SendChatTarget(pData->m_ClientID, aBuf); } - pData->m_pSqlData->GameServer()->SendChatTarget(pData->m_ClientID, "------------------------------------"); + pData->m_pSqlData->GameServer()->SendChatTarget(pData->m_ClientID, "----------------------------------------------------"); dbg_msg("SQL", "Showing times done"); @@ -574,11 +532,10 @@ void CSqlScore::ShowTimesThread(void *pUser) dbg_msg("SQL", aBuf); dbg_msg("SQL", "ERROR: Could not show times"); } - +end: // disconnect from database pData->m_pSqlData->Disconnect(); } - delete pData; lock_release(gs_SqlLock); @@ -597,6 +554,21 @@ void CSqlScore::ShowTop5(int ClientID, int Debut) #endif } + +void CSqlScore::ShowTimes(int ClientID, int Debut) +{ + CSqlScoreData *Tmp = new CSqlScoreData(); + Tmp->m_Num = Debut; + Tmp->m_ClientID = ClientID; + Tmp->m_pSqlData = this; + Tmp->m_Search = false; + + void *TimesThread = thread_create(ShowTimesThread, Tmp); + #if defined(CONF_FAMILY_UNIX) + pthread_detach((pthread_t)TimesThread); + #endif +} + void CSqlScore::ShowTimes(int ClientID, const char* pName, int Debut) { CSqlScoreData *Tmp = new CSqlScoreData(); @@ -604,7 +576,8 @@ void CSqlScore::ShowTimes(int ClientID, const char* pName, int Debut) Tmp->m_ClientID = ClientID; str_copy(Tmp->m_aName, pName, sizeof(Tmp->m_aName)); Tmp->m_pSqlData = this; - + Tmp->m_Search = true; + void *TimesThread = thread_create(ShowTimesThread, Tmp); #if defined(CONF_FAMILY_UNIX) pthread_detach((pthread_t)TimesThread); @@ -647,4 +620,68 @@ void CSqlScore::NormalizeMapname(char *pString) { } } } + +void CSqlScore::agoTimeToString(int agoTime, char agoString[]){ + char aBuf[20]; + int times[7] = { + 60 * 60 * 24 * 365 , + 60 * 60 * 24 * 30 , + 60 * 60 * 24 * 7, + 60 * 60 * 24 , + 60 * 60 , + 60 , + 1 + }; + char names[7][6] = { + "year", + "month", + "week", + "day", + "hour", + "min", + "sec" + }; + + int seconds = 0; + char name[6]; + int count = 0; + int i = 0; + + // finding biggest match + for(i = 0; i<7; i++){ + seconds = times[i]; + strcpy(name,names[i]); + + count = floor(agoTime/seconds); + if(count != 0){ + break; + } + } + + if(count == 1){ + str_format(aBuf, sizeof(aBuf), "%d %s", 1 , name); + }else{ + str_format(aBuf, sizeof(aBuf), "%d %ss", count , name); + } + strcat(agoString,aBuf); + + if (i + 1 < 7) { + // getting second piece now + int seconds2 = times[i+1]; + char name2[6]; + strcpy(name2,names[i+1]); + + // add second piece if it's greater than 0 + int count2 = floor((agoTime - (seconds * count)) / seconds2); + + if (count2 != 0) { + if(count2 == 1){ + str_format(aBuf, sizeof(aBuf), " and %d %s", 1 , name2); + }else{ + str_format(aBuf, sizeof(aBuf), " and %d %ss", count2 , name2); + } + strcat(agoString,aBuf); + } + } +} #endif diff --git a/src/game/server/score/sql_score.h b/src/game/server/score/sql_score.h index 987816459..f861e3e53 100644 --- a/src/game/server/score/sql_score.h +++ b/src/game/server/score/sql_score.h @@ -58,6 +58,7 @@ public: virtual void SaveScore(int ClientID, float Time, CCharacter *pChar); virtual void ShowRank(int ClientID, const char* pName, bool Search=false); virtual void ShowTimes(int ClientID, const char* pName, int Debut=1); + virtual void ShowTimes(int ClientID, int Debut=1); virtual void ShowTop5(int ClientID, int Debut=1); static void agoTimeToString(int agoTime, char agoStrign[]); };