Jump to content
  • Announcements

    • Xmat

      Pravidlo pro postování v TTT

      Do sekce Tipy, triky, tutoriály nepatří žádné dotazy.   Postujte sem vaše návody, tipy a různé další věci jež uznáte za vhodné sdělit zdejšímu osazenstvu, ale veškeré dotazy směřujte do sekce Všeobecná diskuse.
    • Replik

      Seznam návodů a důležitých témat v této sekci

      Pro lepší přehlednost jsem vytvořil tento seznam, který vás, méně zkušené, lépe provede touto sekcí. Věřím, že zde najdete, co hledáte. Vypsané jsou návody, které jsou oficiálně uznané jako návody. Běžné diskuze, které neposkytují postupy a rady zvěřejněny nejsou.   Instalace vlastního MaNGOS Serveru Díky těmto návodům budete (měli by jste být) schopni vytvořit a následně spustit váš vlastní server. Nastavení je pro verze s i bez datadisku.   Instalace MaNGOS Serveru (bez datadisku TBC) - Autor Benny Instalace MaNGOS Serveru (s datadiskem TBC) - Autor Malfik Instalace MaNGOS Serveru v prostředí Linux - Autor charlie Instalace MaNGOS Serveru v prostředí Linux - Autor kupkoid   Chyby a jejich řešení při přihlašování k serveru - Autor Cybe   Zálohování uživatelských dat   Dávkový soubor (BAT soubor) pro vytvoření SQL záloh - Autor Replik   Kompilování - tvoření vlastních release (revizí)   Tvorba kompilací pro Win32 (MangoScript) - Autor bLuma   Ostatní - těžko zařaditelné, ale neznamená to, že nejsou dobré   VIP Systém - Autor charlie Tvorba Webových stránek pro MaNGOS - Autor zahuba Tvorba teleportačních NPC (MangoScript) - Autor Replik Registrační web (původně předělaná SPORA) Funkční pro Antrix i MaNGOS - Autor Replik Nastavení a spuštění Minimanager pro MaNGOS - Autor BlackMartin Nastavení MaNGOS Website - Autor Artorius   Samozřejmě jsou zde i jiné návody, ale tyto jsou nejvíce používané, proto věřím, že vám budou nápomocné. Tuto sekci budeme upravovat podle potřeby. Pokud by jste něco nenašli nebo si nevěděli rady, hledejte na fóru a teprve potom založte vlastní topik. Pokud nějaký autor vytvoří kvalitní návod a chtěl by ho zveřejnit i v tomto seznamu, doporučuji, aby mi napsal zprávu skrze PM.   Díky a přeji hezký den na WoWResource   Replik
    • Aristo

      Příspěvky tam, kde nemají co dělat

      Dodržujte zákaz přispívání do topiků s repaky pokud si to zakladatelé nepřejí!! Opakované psaní příspěvků bude trestáno warnem.
    • Aristo

      Používání spoilerů

      Poslední dobou má většina uživatelů fora zvláštní nutkání postovat extrémně dlouhé texty nebo kódy, které zabírají v nejedenom případu i 80% obsahu celé stránky a hodně tak zvedají nepřehlednost v topiku. Chtěl bych všechny uživatele požádat, aby při postování citací, jakýchkoliv kódů, errorů, atp... delších než 30 řádků používali funkci spoileru.   Funkci vyvoláte příkazem [spoiler] text [/spoiler]   Ukázka:  
Sign in to follow this  
Clant

[MaNGOS]Php mailer system, verze 2.0 GOLD RELEASE + Přečíslovač verze 1.0

Recommended Posts

Php ingame mailer system

verze: 2.0 GOLD RELEASE

 

Jelikož jsem jednou slyšel prosbu, zda by nějak nešlo posílat maily charum ve hře přes net, aniž by bylo potřeba mít wow klienta popřípadě se logovat ingame, tak mě napadlo proč neudělat jednoduchý mailer s pomocí php & MySQL :)

 

Upozornění: PŘED POUŽÍVÁNÍM TOHOTO MAILERU, NAHRAJTE DO SVÉ CHARACTERS DB, TENTO SQL!!!

 

Zdrojový kód

<?php
$adress = "localhost";
$user = "root";
$pass = "root";
$chardb = "characters";

if(array_key_exists("odesilatel", $_POST) 
&& array_key_exists("prijemce", $_POST) 
&& array_key_exists("nadpis",$_POST) 
&& array_key_exists("text", $_POST))
{


mysql_connect($adress, $user, $pass);
mysql_select_db($chardb);

function GetIdSender($odesilatel)
{
  $odesilatel = mysql_real_escape_string($odesilatel);
  $Query = "SELECT guid, name FROM characters WHERE name='".$odesilatel."' LIMIT 1";
  $DbResult = mysql_query($Query);
  $DbRow = mysql_fetch_array($DbResult);
  $Count = $DbRow["guid"];
  mysql_free_result($DbResult);
  return $Count;
}

function GetIdReceiver($prijemce)
{
  $prijemce = mysql_real_escape_string($prijemce);
  $Query = "SELECT guid, name FROM characters WHERE name='".$prijemce."' LIMIT 1";
  $DbResult = mysql_query($Query);
  $DbRow = mysql_fetch_array($DbResult);
  $Count = $DbRow["guid"];
  mysql_free_result($DbResult);
  return($Count);
}

function CreateIdForItemText()
{
  return GetMinIdForItemText() - 1;
}

function CreateIdForMail()
{
  return GetMinIdForMail() - 1;
}

function GetIdText($text)
{
  $text = mysql_real_escape_string($text);
  $Query = "SELECT id FROM item_text WHERE text='".$text."' LIMIT 1";
  $DbResult = mysql_query($Query);
  $DbRow = mysql_fetch_array($DbResult);
  $Count = $DbRow["id"];
  mysql_free_result($DbResult);
  return $Count;
}

function DeliverTime()
{
  return Time() + 10;
}

function ExpireTime()
{
  return Time() + 2592000;
}

function InsertItemText()
{
  $Query = "INSERT INTO `item_text` (`id`, `text`) VALUES ('".CreateIdForItemText()."', '".$_POST["text"]."')";
  $DbResult = mysql_query($Query);
}

function InsertMail()
{
  $Query = "INSERT INTO mail (id, messageType, stationery, mailTemplateId, sender, receiver, subject, itemTextId, has_items, expire_time, deliver_time, money, cod, checked) VALUES ('".CreateIdForMail()."', '0', '41', '0', '".GetIdSender($_POST["odesilatel"])."', '".GetIdReceiver($_POST["prijemce"])."', '".$_POST["nadpis"]."', '".GetIdText($_POST["text"])."', '0', '".ExpireTime()."', '".DeliverTime()."', '0' ,'0', '0');";
  $DbResult = mysql_query($Query);
}

function GetMinIdForMail()
{
  $Query = "SELECT MIN(`id`) FROM mail";
  $DbResult = mysql_query($Query);
  $DbRow = mysql_fetch_array($DbResult);
  $Count = $DbRow[0];
  mysql_free_result($DbResult);
  return($Count);
}

function GetMinIdForItemText()
{
  $Query = "SELECT MIN(`id`) FROM item_text";
  $DbResult = mysql_query($Query);
  $DbRow = mysql_fetch_array($DbResult);
  $Count = $DbRow[0];
  mysql_free_result($DbResult);
  return($Count);
}

echo InsertItemText();
echo InsertMail();
mysql_close()
}
?>

 

Jinak formulář a jeho zdrojový kód

<HTML>
<HEAD>
<TITLE>Mail sender by Clant</TITLE>
</HEAD>
<BODY>
<form action="send.php" method="post">

<b>Odesilatel:</b>
<input type="text" name="odesilatel">
<br>
<b>Prijemce:</b>
<input type="text" name="prijemce">
<br>
<b>Nadpis:</b>
<input type="text" name="nadpis">
<br>
<b>Text:</b>
<input type="text" name="text">
<br>
<input type="submit" name="odeslat" value="Poslat ingame mail">
</form>
</BODY>
</HTML>

 

Přečíslovac pro php ingame mailer system

verze: 1.0 GOLD RELEASE

 

O co jde? Do své webové složky rozbalíte archiv precislovac, ktery je ke stažení níže. Upravíte prozatím MySQL Connection information, nic víc. Přes localhost či webovou adresu se dostanete na index.php této složky. Script sám má napsanou funkci, aby zjistil zda je potřeba přečíslování tabulke nebo ne, když je potřeba tak máte k dispozici ihned odkaz, který Vám přečísluje id v tabulce.

 

UPOZORNĚNÍ: Než kliknete na přečíslování tabulky, zkontrolujte zda v config.php máte nastavené to co je napsáno na posledních 2 řádcích v index.php!

 

Download: Filebeam.com

 

 

Případné dotazy sem, budu rád za každou pomoc!

Edited by Clant

Share this post


Link to post
Share on other sites

100% konečně hotové, mé velké díky patří bLumovi, který mi s něčím pomohl a měl semnou tu trpělivost... děkuji ti :)

 

 

Konečně je to funkční a hotové... tak a mám to z krku :)

 

 

Jinak poslední věc kterou by to chtělo dodělat, by bylo deliver_time... bohužel nevím jak se to počíta, tak pokud by to někdo dodělal nebo by mi sem někdo napsal jak se počíta deliver time aby to fungovalo.

Share this post


Link to post
Share on other sites

doporucoval bych ti to obratit... tzn... nastavit si nejnizsi ID mailu na trebas 70000 a pak nezjistovat nejvetsi ID ale nejmensi minus 1... nevim jak moc si to testoval, ale nez si sem napsal a vydal toto, udelal sem na serveru VIP system se systemem posilani mailu, itemu a goldu z webu primo do hry....

 

doporucuju ti si to otestovat nebot totiz kdyz se mangos naloaduje tak si pamatuje nejvyssi ID mailu kterej tam je pri nacteni a v pripade ze mu do DB das emailu s ID nejvyssim + 1 a nekdo jiny ve hre posle mail... tak se ti ty dve zpravy spoji a prijde to tomu kterej ten item poslal prvni... tzn jestli posles mail a ten dotycny si ho nevybere driv nez se do DB zapise mail novy ze hry.... tak se ti to spoji...

 

proste a jednoduse.... kdyz do DB pridas ten zaznam tak mangos nevi ze si ho tam pridal, protoze si pamatuje nejvyssi ID pri loadovani serveru a ktomu pricita... tzn... musis davat nejnizsi zaznam aby nedoslo k prepsani tveho zaznamu... kazdopadne si samozrejme musis nastavit overeni jestli nedojde na cislo 0. ale kdyz to udelas jak sem psal tak mas vystarano a bude ti to fungovat bez problemu.

Edited by mystiq

Share this post


Link to post
Share on other sites

vyřešil jsem to trochu jinak, navíc to co si psal, nevim jak mám dat dokupy danou funkci, když si řekl at dám základní ID třeba 70000 a pak odečítam -1 i to nemá smysl, protože si poté řekl at vybíram nejnižší výsledky a nejnižší by byli co děla MaNGOS když někdo pošle mail....teda jestli mě chápeš?

 

Vyřešil jsem to umělym vložením mailu a textus ID 100000 a od toho se bude dále počítat +1 :)

 

UPDATED FIRST POST

Share this post


Link to post
Share on other sites
Vyřešil jsem to umělym vložením mailu a textus ID 100000 a od toho se bude dále počítat +1 :)

 

UPDATED FIRST POST

 

Ve chvíli, kdy se ti restartuje mangos tak taky bude počítat od toho id.

Share this post


Link to post
Share on other sites
Ve chvíli, kdy se ti restartuje mangos tak taky bude počítat od toho id.

jako po resu MaNGOSu zacne zase pocitat od nejvyssiho?

Share this post


Link to post
Share on other sites

Ano tak ... není lepší to ID nevkládat a nechat at se to doplní samo?

Edited by hisgrak

Share this post


Link to post
Share on other sites
Ano tak ... není lepší to ID nevkládat a nechat at se to doplní samo?

tyto tabulky nemaji auto_increment, takze id se tam nevklada samo... :whistling:

Share this post


Link to post
Share on other sites

mangos si při startu zjistí nejvyšší hodnotu a pak pouze inkrementuje. takže ti ke kolizi dojít může

Share this post


Link to post
Share on other sites
mangos si při startu zjistí nejvyšší hodnotu a pak pouze inkrementuje. takže ti ke kolizi dojít může

v tom případě jak má vypadat funkce, která to vždy sníží o jedno? ta bude trochu složitá si myslim

Edited by Clant

Share this post


Link to post
Share on other sites

si me asi spatne pochopil.... ID se stale zvysuje a neni na nem autoincrement od SQL ale zvysuje si ho sam mangos... pokazde si nacte posledni nejvyssi ID a ktomu pricita. I kdyz podle tveho napadu zvysis ID na 100 000 a budes k nemu pricitat tak po padu serveru si ale mangos veme tech 100 000 takze ses tam kde si byl....

 

Stare a vybrane emaily se z DB mazou tim ti tam vznika mezera kterou prave musis vyuzit.... pokud nejnizsi ID je opravdu nizke.. napriklad 80 ... tak je potreba to bud precislovat nebo ty stare promazat a nechat si tam treba nejnizsi ID cca 5 000 podle poctu hracu co ti tam hraje.... samozrejme si ale musis udelat podminku kdyby doslo na 0.

 

pouzij

 SELECT MIN(`id`) FROM mail

Edited by mystiq

Share this post


Link to post
Share on other sites

Takže první post upraven :)

 

Nyní je potřeba před začnutím tohoto mail systému vložit ten query, který je zmíněný nahoře, vytvoří záznamy, které nemají žádnou hodnotu pouze id mají 100000 a od něho se pak bude odpočítavat, tudiž jde poslat 100000 mailů přes tento mailer systém.

 

Děkuji Mystiqovi za pomoc s MySQL dotazem a bLumovi za menší pomoc s následným výpisem.

 

 

 

Nyní už jen chybí ten čas deliver_time, neví někdo jak se počítá?

Share this post


Link to post
Share on other sites

deliver time je datum preveden na string

 

zpetny vypocet z obsahu DB vypoctes treba takhle

 

$datum=Date("Y-m-d",$db_row["deliver_time"]);
echo $datum;

 

napriklad kdyz bude mit deliver_time hodnotu 1213908642 tak vysledek je 2008-06-19

a opacne to zas je takhle:

 

$x=strtotime($db_row["datum_zadani"]);

 

a to X vlozis do DB

Share this post


Link to post
Share on other sites

problém je v tom že deliver_time, na kolik ho nastavit? Dát ho okamžitě jakmile bude formulář vyplněn a vložen do db, tak by byl mail ihned ve hře k mání?

Share this post


Link to post
Share on other sites
problém je v tom že deliver_time, na kolik ho nastavit? Dát ho okamžitě jakmile bude formulář vyplněn a vložen do db, tak by byl mail ihned ve hře k mání?

 

u sebe to mam okamzite nebot lidi nechtej cekat... ale muzes vzit to co sem psal vejs a ktomu stringu pricpocti hodnotu v sekundach a vysledek je deliver time... napriklad vyse zminovana hodnota 1213908642 ma presnou hodnotu: 2008-06-19 10:50:42 kdyz ktomu pripoctes 3600 (hodina) tak to pride az za hodinu to jest 2008-06-19 11:50:42 :

napriklad $datum=Date("Y-m-d h:i:s", 1213908642+3600); // tohle je ten priklad z meho postu

 

opacnym vypoctem viz vejs se zase dostanes na string kterej tam vlozis...

 

uz to tak nejak chapes nebo to jen blbe vysvetluju? :)

 

P.S. proste ten string (hodnota v deliver_time a expire_time) je vlastne cislo v sekundach od 1970-01-01 01:00:00

Edited by mystiq

Share this post


Link to post
Share on other sites

chápu tě, ale jak tedy v tom případě bude vypadat, když tam budu vkládat okamžitou hodnotu?

 

edit: takze tam budu vkladat okamzitou hodnotu funkce Time() jestli se nepletu?

Edited by Clant

Share this post


Link to post
Share on other sites

udelej to primo na bazi SQL dotazu tzn do pole expire_time vlozis (time() + (30*24*3600)) a do deliver_time vlozis (time()+5) ta 5 je tam kvuli tomu ze hodnota time() ukazuje hodnotu presne NOW a provedeni scriptu trva urcitou dobu... proto 5 sekund navic

 

jestli to nechces delat primo na bazi SQL dotazu tak si to vypocti v PHP

 

$expire_time=(time() + (30*24*3600));
$deliver_time=(time() +5);

 

a pak to jen vlozis do DB... pokud tu hodnotu chces menit tak si tech 5 dej jako promenou a nekde si ji nastav... elegantnejsi reseni je samozrejme zadat to primo v SQL dotazu.

Share this post


Link to post
Share on other sites

řeším to takto, že do sloupce deliver_time, vložím výsledek této funkce...

 

function DeliverTime()
{
  return Time() + 10;
}

 

přidává to ještě 10 sec na zpracování, takže si myslím že takto by to bylo ok ne?

Share this post


Link to post
Share on other sites

pises to ty ne ja :) ale muzes to tak nechat... kazdopadne nezapomen na expire_time , mangos totiz pri loadovani maze EXPIRED maily... tzn kdyz je aktualni datum stejny nebo vetsi nez deliver_time tak to mangos smaze... takze na to pozor... to co sem napsal ja nahore je expire time na jeden mesic od data poslani.

Share this post


Link to post
Share on other sites

Tak konečně hotovo :) už to umí a dělá vše co by mělo.

 

Jinal zpráva bude odeslána do 10 vteřin od vyplnění formuláře a v databázy budou 1 měsíc.

 

Byl bych rád kdyby to někdo otestoval ingame, nějak mi blbne ftp na web, tak to nemohu vyzkoušet.

Edited by Clant

Share this post


Link to post
Share on other sites

a funguje vůbec ?dvakrát tam snažíš se něco provést se stejnou tabulkou. aspoň si to vyzkoušej než to vypustíš jako verzi 1.0 :)

Share this post


Link to post
Share on other sites

sry za otevirani hodne staryho topicu, ale mohl by pls nekdo reup? Dik

Edited by bombajs

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

Sign in to follow this  

×