MySQL Frage

Wichtiger Hinweis: Bitte ändert nicht manuell die Schriftfarbe auf schwarz sondern belasst es bei der Standardeinstellung. Somit tragt ihr dazu bei dass euer Text auch bei Verwendung unseren dunklen Forenstils noch lesbar ist!

Tipp: Ihr wollt längere Codeausschnitte oder Logfiles bereitstellen? Benutzt unseren eigenen PasteBin-Dienst Link
  • Guten Tag,


    ich arbeite derzeit erneut an meinem Adminsystem [MySQL], letztendlich stellt sich aber bei bestimmten Commands mir eine Frage.
    Sagen wir mal so, ich arbeite derzeit an einem Timeban System, welches wie folgt aufgebaut ist.

    Spoiler anzeigen
    ocmd:tban(playerid,params[])
    {
    new pID,reason[31],zeit,string[256],cmd[15],zeitdauer;
    if(!isPlayerAnAdmin(playerid,3))return SendClientMessage(playerid,COLOR_GRAU,"Du kannst diesen Befehl nicht benutzen.");
    if(sscanf(params,"udss",pID,zeit,cmd,reason))return SendClientMessage(playerid,COLOR_WRONG,"Benutze: /tban [ID/Teilname][Zeit][Minuten/Stunden/Tage/Wochen][Grund]");
    if(strlen(reason) > 30)return SendClientMessage(playerid,COLOR_WRONG,"Benutze: /tban [ID/Teilname][Zeit][Minuten/Stunden/Tage/Wochen][Grund]");
    if(!IsPlayerConnected(pID))return SendClientMessage(playerid,COLOR_GRAU,"Der angegebene Spieler ist nicht eingeloggt.");
    if(IsPlayerNPC(pID))return SendClientMessage(playerid,COLOR_GRAU,"Einen NPC kannst du nicht timebannen.");
    if(SpielerInfo[playerid][pAdminlevel] == 3)
    {
    if(SpielerInfo[pID][pAdminlevel] > SpielerInfo[playerid][pAdminlevel])return SendClientMessage(playerid,COLOR_GRAU,"Diesen Befehl kannst du bei dieser Person nicht benutzen.");
    }
    if(strcmp(cmd,"Wochen",true) == 0)
    {
    zeitdauer = gettime()+(60*60*24*7*zeit);//in wochen
    format(string,sizeof(string),"%s hat den Spieler %s für %i Woche/n gebannt, Grund: %s",SpielerInfo[playerid][pName],SpielerInfo[pID][pName],zeit,reason);
    SendClientMessageToAll(COLOR_ROT,string);
    SpielerInfo[playerid][pTimeban] = zeitdauer;
    SpielerInfo[playerid][pGebannt] = 1;
    BanUser(pID,SpielerInfo[playerid][pName],reason,zeitdauer);
    return 1;
    }
    if(strcmp(cmd,"Tage",true) == 0)
    {
    zeitdauer = gettime()+(60*60*24*zeit);//in tagen
    format(string,sizeof(string),"%s hat den Spieler %s für %i Tag/e gebannt, Grund: %s",SpielerInfo[playerid][pName],SpielerInfo[pID][pName],zeit,reason);
    SendClientMessageToAll(COLOR_ROT,string);
    SpielerInfo[playerid][pTimeban] = zeitdauer;
    SpielerInfo[playerid][pGebannt] = 1;
    BanUser(pID,SpielerInfo[playerid][pName],reason,zeitdauer);
    return 1;
    }
    if(strcmp(cmd,"Stunden",true) == 0)
    {
    zeitdauer = gettime()+(60*60*zeit);//in stunden
    format(string,sizeof(string),"%s hat den Spieler %s für %i Stunde/n gebannt, Grund: %s",SpielerInfo[playerid][pName],SpielerInfo[pID][pName],zeit,reason);
    SendClientMessageToAll(COLOR_ROT,string);
    SpielerInfo[playerid][pTimeban] = zeitdauer;
    SpielerInfo[playerid][pGebannt] = 1;
    BanUser(pID,SpielerInfo[playerid][pName],reason,zeitdauer);
    return 1;
    }
    if(strcmp(cmd,"Minuten",true) == 0)
    {
    zeitdauer = gettime()+(60*zeit);//in minuten
    format(string,sizeof(string),"%s hat den Spieler %s für %i Minute/n gebannt. Grund: %s",SpielerInfo[playerid][pName],SpielerInfo[pID][pName],zeit,reason);
    SendClientMessageToAll(COLOR_ROT,string);
    SpielerInfo[playerid][pTimeban] = zeitdauer;
    SpielerInfo[playerid][pGebannt] = 1;
    BanUser(pID,SpielerInfo[playerid][pName],reason,zeitdauer);
    return 1;
    }
    return 1;
    }


    Der Wert wie lange der Spieler gebannt ist wird halt in der Zeile gesetzt, aber wie bekomme ich den Wert jetzt runtergezählt und sobald er wieder bei 0 ist, den Spieler entsperrt?

    Spoiler anzeigen
    stock BanUser(playerid,admin[],reason[],zeit = -1)
    {
    new query[256];
    gettime(stunde,minute,sekunde);
    getdate(jahr,monat,tag);
    format(query,sizeof(query),"Admin: %s * Zielperson: %s * Grund: %s * Zeit: %i",admin,SpielerInfo[playerid][pName],reason,zeit);
    Log("Bannedsqllog",query);
    SavePlayer(playerid);
    TogglePlayerControllable(playerid,0);
    SetCameraBehindPlayer(playerid);
    SpielerInfo[playerid][pGebannt] = 1;
    SetTimerEx("KickDelayed",100,0,"i",playerid);
    return 1;
    }

  • Hey.
    Setz den Wert in der Datenbank nicht runter, sonder frag einfach beim Login ab ob die aktuelle Zeit (Timestamp) gleich oder größer
    ist als die die in der Datenbank gespeichert wurde. Denn dann hat er seinen Bann abgesessen.


    Ich kann dir jetzt nicht ganz folgen, setzt sich der Wert automatisch in der Tabelle runter oder wie?
    Letztendlich muss der Wert ja wieder bei 0 ankommen, damit die komplette Zeit abgesessen wurde.

  • Du fügst in deine Tabelle ein Datum mit Uhrzeit ein.
    An dem du bannst.


    Danach beim Login des entsprechenden User musst du abfragen ob das Datum und die Uhrzeit älter als sagen wir 60 min sind.


    Wenn das zutrifft darf er einloggen, ansonsten nicht.


    Edit:
    Bzw. du fügst das Datum ein an dem er wieder entbannt ist. Wenn er sich dann einloggt musst du abfragen ob das Datum schon vorbei ist.

    • Offizieller Beitrag

    Nein.
    Ich versuche dir das Schritt für Schritt zu erklären.

    • Spieler wird Timegebannt, für z.B. 30 Minuten => Timestamp + 30 Minuten (<= Natürlich ausgerechnet, so wie du es hast)
    • Spieler versuchst sich nach 10 Minuten einzuloggen, beim connecten wird der aktuelle Timestamp mit der die sich in der Datenbank befindet verglichen.
      Da er sich nach 10 Minuten einloggt und nicht nach 30 kriegt er natürlich die Meldung, das er gebannt ist. Das heißt, der aktuelle Timestamp ist kleiner als der
      der sich in der Datenbank befindet.
    • Wenn er die 30 Minuten abgesessen hat ist der aktuelle Timestamp größer oder gleichgroß als der Timestamp in der Datenbank.


    Timestamps sind nichts anderes als die Zeit nur in Zahlen.
    Der 14.03.2014 - 13:38:00 Uhr = 1394804280
    Und wenn er für 30 Minuten gebannt wird
    14.03.2014 - 14:08:00 Uhr = 1394806080
    Wie du sehen kannst ist der Timestamp an seinem Ban kleiner als der nach 30 Minuten.


    Kleines Beispiel:
    new CurrentTime = gettime(), // Sagen wir mal es ist 13:50 Uhr, dann beträgt gettime() = [b]1394805000[/b]
    TimebanEnd = 1394806080; // Das ist der Timestamp für wie lange er gebannt sein soll.
    // TimebanEnd wird natürlich aus der Datenbank ausgelesen und gesetzt.



    if(CurrentTime >= TimebanEnd) {
    // Aktion um die Person zu entbannen
    } else {
    // zeit noch nicht vorbei
    }
    Ich hoffe das war verständlich genug :)