ThWboard Support-Forum (Archiv)

Ort: / Boardübersicht / Code Hack Requests / PM Limit pro Monat


Seite 1 von 1

mk2 schrieb am 08.02.2006 um 00:09 Uhr

Hallo,

ich bin gerade am testen des THWB und da es mir sehr zusagt, werde ich es für "meine" Community zum Einsatz bringen.

Aus mir bekannten Grunde hätte ich gerne, dass jeder registrierte User (Gäste haben nur Leserechte) max. 100 PMs je Monat versenden darf.

Gibt es dazu einen Hack? Damit wäre mir sehr geholfen....

PhoenixDH schrieb am 08.02.2006 um 07:55 Uhr

Nein gibt es nicht!

Zur Umsetzung: z.B. ne extra Tabelle der den Counter pro verschickter PM hochzählt und die Userid dazu speichert! Am Ende des Monats leerste die Tabelle wieder! Dann musste die pm.php halt noch anpassen!

Narodnaja schrieb am 11.02.2006 um 09:03 Uhr

einfacher wäre ne zusätzliche Spalte in der _user, die die verschickten PMs pro Monat zählt, und ne Spalte, die den letzten Monat speichert, in denen PMs abgeschickt wurden.

user_pm_sent | user_pm_month
25             8

dann einfach in die header.inc.php eine Funktion rein, die folgendes macht:

function pm_reset()
{
lese aus date() den aktuellen monat aus
vergleiche mit gespeichertem Monat aus user_pm_month
if aktueller monat ungleich gespeicherter Monat
dann user_pm_sent zurücksetzen auf 0
(wenn du es richtig machen willst, solltest du auch noch das Jahr speichern und vergleichen. Ob aber einer, der 12 Monate keine PMs verschickt, von dem Limit betroffen sein muss, musst du selber wissen)
}

dann in der header.inc.php die beiden Felder noch in den Query, der die Userdaten ausliest.
Anschließend in die pm.php eine Abfrage rein, die das Limit abfragt. Hier kannst du zb anzeigen, wie viele pms noch versendet werden können.
Wenn das Limit erreicht ist, gibst du eine Nachricht aus, dass es nicht geht, und bastelst das am besten auch noch in die sende-funktion, damit nicht einer das umgehen kann.

mk2 schrieb am 11.02.2006 um 10:13 Uhr

@Narodnaja

danke dass du dir Gedanken über eine Lösung gemacht hast. Ich bin leider in php so gar nicht fit :)

Falls du Zeit und Lust hast wäre es echt suuuper, wenn du das funktionsfähig hier widergeben könntest. Ich schätze dass auch andere auf die Lösung zurückgreifen würden.

Das wäre echt super, aber natürlich nur wenn du Zeit und Lust hast!

Narodnaja schrieb am 11.02.2006 um 14:54 Uhr

Hallo mk2,

bin zur Zeit ziemlich im Stress, vielleicht kann ichs aber in den nächsten 14 Tagen irgendwann einschieben. Welche Board-Version nutzt du ? Welche Hacks hast du installiert, bzw wirst du installieren ? Welche PHP-Version und welche MySQL-Version läuft bei deinem Provider ?
Ich kann nix versprechen, aber schau ma mal :)

mk2 schrieb am 12.02.2006 um 14:50 Uhr

Hallo Narodnaja,

das wär super wirklich, auf ein paar Tage hin oder her kommt es nicht an, weil ich gerade dabei bin, das ganze local aufzubauen.

Dabei greife ich auf Version 2.81 zurück, weil ich mit dieser schon gearbeitet habe und aus "alten" Zeiten auch schon Hacks eingebaut habe, die mir bzw. der Community entgegen kamen.

Eingebaute Hacks:
- Postedit durch Admin wird nicht mehr angezeigt
- Kartenhack (User können sich auf Landkarte eintragen)
- Avatare werden im Profil angezeigt
- Post an Admin melden
- Admin kann HTML posten
- Tagbar (also kleiner wysiwyg Editor für Posts erstellen)
- "Unterforen"
- Threadsprungmarken (rauf/runter)
- Userlist mit Alphabet (A B C...) anwählbar

Wär wirklich toll wenn du das hinkriegst, und wie gesagt, es muss nicht morgen sein :)
Ich würde ein oder zwei Bier für dich mittrinken :)

Narodnaja schrieb am 25.03.2006 um 11:13 Uhr

*das* war das ... hab doch gewusst ich hab was vergessen. Ist das noch aktuell ?

mk2 schrieb am 25.03.2006 um 15:32 Uhr

Ja noch sehr aktuell, ich guck doch jeden Tag ob was gekommen ist von dir :)

Narodnaja schrieb am 28.03.2006 um 20:43 Uhr

/edit: jetzt mal die Felder vernünftiger gemacht (siehe nächste zwei Posts)

Na denn :)

Schritt 0: Datenbestand sichern, ich übernehme keinerlei Garantie !!
Bei mir hat alles geklappt, ich habe auch Erfahrung mitm ThWBoard-Coden, aber trotzdem - auf eigene Gefahr ;)

Nachdem das erledigt ist:

Schritt 1: Dein Präfix rausfinden

Schritt 2: PhpMyAdmin o.ä., folgenden Code eingeben und statt PRÄFIX_user deine Bezeichnung einfügen (ergibt z.B. tb_user):

ALTER TABLE `PRÄFIX_user` ADD `userpm_sent` SMALLINT( 5 ) UNSIGNED NOT NULL DEFAULT '0', ADD `userpm_month` TINYINT( 2 ) NOT NULL DEFAULT '0', ADD `userpm_year` SMALLINT( 4 ) NOT NULL DEFAULT '0';

Schritt 3: Datei inc/functions.inc.php, ans Ende einfügen:

// HACK PM-LIMIT 
function pm_reset()
{
    global $pref, $g_user;
    
    $heute = getdate();
    $monat = $heute['mon'];
    $jahr = $heute['year'];

    if (($g_user['userpm_month'] < $monat) OR ($g_user['userpm_month'] == 12 AND $g_user['userpm_year']<$jahr))
    {
        thwb_query("UPDATE ".$pref."user SET userpm_month='".$monat."', userpm_sent='0' WHERE userid='".$g_user['userid']."'");
    }
}
/// HACK PM-LIMIT

Schritt 4: Datei inc/header.inc.php, in die Zeile hier

$r_user = thwb_query("SELECT username, useremail, userid, userpassword, userhidesig,

(dürfte beim Board etwa Zeile 170 rum sein) noch die neuen Tabellenspalten eintragen, dürfte dann so etwa aussehen:

$r_user = thwb_query("SELECT username, useremail, userid, userpassword, userhidesig, userpm_sent, userpm_month, userpm_year,

Wichtig ist, die Kommas auch am Ende nicht zu vergessen, danach kommen noch weitere Namen.

Schritt 5: Datei pm.php, ganz am Anfang nach der include-Anweisung folgenden Code rein:

// HACK PM-LIMIT
pm_reset();
$pm_max = 100;
$heute = getdate();
$monat = $heute['mon'];
$jahr = $heute['year'];    
$r_pm_user = thwb_query("SELECT userpm_sent, userpm_month FROM ".$pref."user WHERE userid='".$g_user['userid']."'");
$pm_user = mysql_fetch_array($r_pm_user);
$pm_sent = $pm_user['userpm_sent'];
$pm_month = $pm_user['userpm_month'];
$monat_deutsch = array(1 => "Januar", 2 => "Februar", 3 => "M&auml;rz", 4 => "April", 5 => "Mai", 6 => "Juni",
                       7 => "Juli", 8 => "August", 9 => "September", 10 => "Oktober", 11 => "November", 12 => "Dezember");
$akt_monat = $monat_deutsch[$pm_month];

if ($pm_sent < $pm_max)
{ $pm_possible = 1; }
else { $pm_possible = 0; }
// HACK PM-LIMIT

Schritt 6: gleiche Datei, direkt nach elseif( $action == "new" ) folgendes in die geschweifte Klammer einfügen:

// PM-Limit Hack
    if (!$pm_possible)
    {
        message('Fehler','Sie k&ouml;nnen für diesen Monat keine PM mehr verschicken.<br>Bitte wenden Sie sich an einen Administrator, wenn Sie einen Fehler vermuten.');
    }
    // PM-Limit Hack

Schritt 7: gleiche Datei (pm.php), in beide send-Anweisungen folgenden Code einfügen (jeweils nach $navpath .= "Private Messages";

// PM-Limit Hack
thwb_query("UPDATE ".$pref."user SET userpm_month='".$monat."', userpm_year='".$jahr."', userpm_sent=userpm_sent+1 WHERE userid='".$g_user['userid']."'");
// PM-Limit Hack

Wichtig ist, dass du es für beide Möglichkeiten (senden per email und per pm) einfügst, sonst unterläuft dir das einer.

Schritt 8: gleiche Datei, ganz weit unten: nach

$inbox_mails = 0;
    $inbox_mails_new = 0;
    $outbox_mails = 0;

folgendes einfügen:

// PM-Limit Hack
    if ($pm_possible == 1)
    {
        $pm_newlink = "<a href=\"pm.php?action=new\">Neue Nachricht</a>";
    }
    else
    {
        $pm_newlink = "keine neue PM f&uuml; diesen Monat möglich !";
    }
    // PM-Limit Hack

Schritt 9: Datei templates/alledeinetemplatepfade/pm.html (für jedes Template-Verzeichnis !) folgendes ändern:

Ersetze

Zeile 26 - 29:
                 <td align="right">
                    $style[smallfont]<b>$full_box</b> / <b>$config[max_privmsg]</b> Nachrichten - <b>$diskquota%</b> belegt<br>$style[smallfontend]
                    $style[stdfont]<a href="pm.php?action=new">Neue Nachricht</a> || <a href="pm.php?action=deleteall">Alle Nachrichten L&ouml;schen</a>$style[stdfontend]
                  </td>

durch

<td align="right"> $style[smallfont]<b>$full_box</b> / <b>$config[max_privmsg]</b> 
                    Nachrichten - <b>$diskquota%</b> belegt<br>
                    <b>$pm_sent / $pm_max</b> f&uuml;r <b>$akt_monat </b>versendet<br>
                    $style[smallfontend]
                    $style[stdfont]$pm_newlink || <a href="pm.php?action=deleteall">Alle Nachrichten L&ouml;schen</a>$style[stdfontend]
                  </td>

Schritt 10: fertig.

Ich habe bei mir getestet soweit möglich, hat alles geklappt.
Das Limit ist jetzt einfach direkt in den Quellcode geschrieben, kann man natürlich noch verbessern per Admincenter, aber dazu hab ich atm wirklich keine Zeit ;)

Meld dich wenn was nicht klappt.

/edit: jetzt mal die Felder vernünftiger gemacht (siehe nächste zwei Posts)

theDon schrieb am 28.03.2006 um 21:36 Uhr

Wofuer zur Hoelle brauchst du vier Ziffern fuer die userpm_month?

Narodnaja schrieb am 28.03.2006 um 22:21 Uhr

Öhm. Wer braucht das schon ... außerdem macht Tinyint nur bis 127 mit, wenns nicht unsigned ist - das ist nicht so praktisch wenn jemand mehr als 127 PMs erlauben will ... Hab da mal wieder zu Beginn irgendwas eingegeben und nachher nicht vernünftig angepasst :\

Also besser:

ALTER TABLE `PRÄFIX_user` ADD `userpm_sent` SMALLINT( 5 ) UNSIGNED NOT NULL DEFAULT '0', ADD `userpm_month` TINYINT( 2 ) NOT NULL DEFAULT '0', ADD `userpm_year` SMALLINT( 4 ) NOT NULL DEFAULT '0';

65535 PMs pro Monat sollten dann aber wohl reichen.

ich editiers mal besser oben rein *räusper*

/edit: also wenn mans genau nimmt muss ja auch das Jahr nicht unsigned sein ... *kopfschüttel*

mk2 schrieb am 29.03.2006 um 19:03 Uhr

Hi Narodnaja,

vielen lieben Dank, find ich echt superklasse, dass du dich so ausführlich der Sache angenommen hast!

Hab deinen Hack gerade local eingebaut (dump db natürlich vorher) und das Forum läuft noch (grins), auch die PM Zählung funktioniert.
Werd jetzt mal 100PMs versenden und mal sehen was passiert :)

Was mir noch eingefallen ist... hab jetzt zwar auf den Code nicht inhaltlich geachtet sondern nur übernommen, aber denke nicht dass das berücksichtigt ist: wär gut wenn alle in Gruppe administrator und moderator das PM Limit nicht haben.

Ach ja.. EINE Sache musste ich ändern, da ich ne Fehlermeldung beim Aufruf des PM Links bekam:

// PM-Limit Hack
if ($pm_possible == 1)
{
$pm_newlink = "<a href='pm.php?action=new'>Neue Nachricht</a>";
}
else
{
$pm_newlink = "keine neue PM f&uuml;r diesen Monat m&ouml;glich !";
}
// PM-Limit Hack

Da musste ich IM href die " durch ' ersetzen, aber dann liefs, wie hier dargestellt.
So, jetzt mal testen :)

Danke nochmals!

mk2 schrieb am 29.03.2006 um 19:16 Uhr

okay, getestet und für super befunden erstmal :D
hab mir das pm limit zum testen erst mal runter gesetzt ;)
systemdatum umgestellt auf april und schon fing die zählung von vorne an. superklasse echt! Danke =)

Narodnaja schrieb am 29.03.2006 um 19:40 Uhr

gerne =)
Hmm. In Kombination mit Gruppen ... *grübel* evtl. lass ich mir das nochmal durchn Kopf gehen. Ich versprech aber nischt *g*

/edit: wegen den ": Im Post sind die entsprechenden eigentlich escaped ... wird nur nicht angezeigt ? Ist das ein Bug im [ code ] Tag ?

mk2 schrieb am 01.04.2006 um 00:55 Uhr

Hi,

hab das script heute testweise online aktiv gesetzt und festgestellt, dass der counter so alle 10 - 20 minuten automatisch um 1 pm hochzählt, obwohl man keine pm verschickt hat.

auf meinem localhost auf meinem eigenen windows rechner ist das nicht der Fall.
Irgendeine Idee oder gar Lösung? :(

Narodnaja schrieb am 01.04.2006 um 19:33 Uhr

?
Keine Ahnung ehrlich gesagt ... wo zählt er denn ? Nur bei einem User oder bei allen ?

mk2 schrieb am 02.04.2006 um 12:57 Uhr

Also ich habs bei meinem eigenen Account (adminstatus) bemerkt, und hab das script dann wieder vom server genommen.

mk2 schrieb am 02.04.2006 um 14:50 Uhr

okay so wie's aussieht, hab ich die Ursache gefunden.
und zwar zählt der PM Counter nicht nur beim Absender der PM um je 1 hoch, sondern auch beim PM Empfänger. Also der, der die PM erhält, kriegt +1 beim Counter dazu, obwohl er eben Empfänger ist und nicht gesendet hat. Sollte natürlich nicht sein. Wär super wenn du dir das ansehen könntest!

Vielen Dank schon mal :)

Narodnaja schrieb am 02.04.2006 um 15:10 Uhr

Da musst eher du gucken wo du das eingebaut hast ;)

Schritt 7: gleiche Datei (pm.php), in beide send-Anweisungen folgenden Code einfügen (jeweils nach $navpath .= "Private Messages";

// PM-Limit Hack
thwb_query("UPDATE ".$pref."user SET userpm_month='".$monat."', userpm_year='".$jahr."', userpm_sent=userpm_sent+1");
// PM-Limit Hack    

Wichtig ist, dass du es für beide Möglichkeiten (senden per email und per pm) einfügst, sonst unterläuft dir das einer.

Poste doch mal die Teile der pm.php wo du das eingebaut hast, ich vermute nämlich da den Fehler. Wenns korrekt eingebaut ist zählt er erst und nur dann hoch wenn du sendest.

mk2 schrieb am 02.04.2006 um 16:09 Uhr

ah okay, hier war ich mir eh nicht so sicher :)

hab dir die pm.php gezipt und zum download bereit gestellt:
www.streetbandits.de/vorlagen/pm.zip

Narodnaja schrieb am 03.04.2006 um 10:46 Uhr

ARGH :(
Depp ich. Sorry, mein Fehler, da hat sich der Fehlerteufel in die Anleitung eingeschlichen :\

Der Code für die pm.php muss natürlich richtigerweise heissen:

// PM-Limit Hack
thwb_query("UPDATE ".$pref."user SET userpm_month='".$monat."', userpm_year='".$jahr."', userpm_sent=userpm_sent+1 WHERE userid='".$g_user['userid']."'");
// PM-Limit Hack

Sonst macht er natürlich das was du beschrieben hast - bei jedem PM-Senden bei _allen_ Usern um eins hochzählen. Sorry !

Ich korrigiers mal oben.

/edit: done, oben auch alles korrekt.

mk2 schrieb am 03.04.2006 um 19:48 Uhr

Hi,

okay, vielen Dank, hab das update gemacht und jetzt siehts besser aus :)
Testmonat läuft....

Seite 1 von 1