2011-07-02 23:03:18 +00:00
/*****************************************************************************
* PokerTH - The open source texas holdem engine *
* Copyright (C) 2006-2011 Felix Hammer, Florian Thauer, Lothar May *
* *
* This program is free software: you can redistribute it and/or modify *
* it under the terms of the GNU Affero General Public License as *
* published by the Free Software Foundation, either version 3 of the *
* License, or (at your option) any later version. *
* *
* This program is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
* GNU Affero General Public License for more details. *
* *
* You should have received a copy of the GNU Affero General Public License *
* along with this program. If not, see <http://www.gnu.org/licenses/>. *
2011-07-03 19:45:08 +00:00
*****************************************************************************/
#include "guilog.h"
2010-12-13 22:09:48 +00:00
#include "gametableimpl.h"
#include <handinterface.h>
#include <session.h>
#include <game.h>
2011-03-20 22:16:57 +00:00
#include <cardsvalue.h>
2010-12-13 22:09:48 +00:00
#include <game_defs.h>
#include "gametablestylereader.h"
using namespace std ;
2011-12-22 00:29:21 +00:00
guiLog :: guiLog ( gameTableImpl * w , ConfigFile * c ) : myW ( w ), myConfig ( c ), myLogDir ( 0 ), myHtmlLogFile ( 0 ), myHtmlLogFile_old ( 0 ), myTxtLogFile ( 0 ), tb ( 0 )
2010-12-13 22:09:48 +00:00
{
2011-02-11 20:02:08 +00:00
myW -> setGuiLog ( this );
myStyle = myW -> getMyGameTableStyle ();
2010-12-13 22:09:48 +00:00
2011-02-11 20:02:08 +00:00
myAppDataPath = QString :: fromUtf8 ( myConfig -> readConfigString ( "AppDataDir" ). c_str ());
2010-12-13 22:09:48 +00:00
2011-02-27 16:34:39 +00:00
connect ( this , SIGNAL ( signalLogPlayerActionMsg ( QString , int , int )), this , SLOT ( logPlayerActionMsg ( QString , int , int )));
2011-02-11 20:02:08 +00:00
connect ( this , SIGNAL ( signalLogNewGameHandMsg ( int , int )), this , SLOT ( logNewGameHandMsg ( int , int )));
connect ( this , SIGNAL ( signalLogNewBlindsSetsMsg ( int , int , QString , QString )), this , SLOT ( logNewBlindsSetsMsg ( int , int , QString , QString )));
connect ( this , SIGNAL ( signalLogPlayerWinsMsg ( QString , int , bool )), this , SLOT ( logPlayerWinsMsg ( QString , int , bool )));
connect ( this , SIGNAL ( signalLogPlayerSitsOut ( QString )), this , SLOT ( logPlayerSitsOut ( QString )));
connect ( this , SIGNAL ( signalLogDealBoardCardsMsg ( int , int , int , int , int , int )), this , SLOT ( logDealBoardCardsMsg ( int , int , int , int , int , int )));
2011-02-27 16:34:39 +00:00
connect ( this , SIGNAL ( signalLogFlipHoleCardsMsg ( QString , int , int , int , QString )), this , SLOT ( logFlipHoleCardsMsg ( QString , int , int , int , QString )));
2011-02-11 20:02:08 +00:00
connect ( this , SIGNAL ( signalLogPlayerLeftMsg ( QString , int )), this , SLOT ( logPlayerLeftMsg ( QString , int )));
2011-11-01 00:02:12 +00:00
connect ( this , SIGNAL ( signalLogPlayerJoinedMsg ( QString )), this , SLOT ( logPlayerJoinedMsg ( QString )));
2011-02-11 20:02:08 +00:00
connect ( this , SIGNAL ( signalLogNewGameAdminMsg ( QString )), this , SLOT ( logNewGameAdminMsg ( QString )));
connect ( this , SIGNAL ( signalLogPlayerWinGame ( QString , int )), this , SLOT ( logPlayerWinGame ( QString , int )));
connect ( this , SIGNAL ( signalFlushLogAtGame ( int )), this , SLOT ( flushLogAtGame ( int )));
connect ( this , SIGNAL ( signalFlushLogAtHand ()), this , SLOT ( flushLogAtHand ()));
2010-12-13 22:09:48 +00:00
2011-02-11 20:02:08 +00:00
logFileStreamString = "" ;
lastGameID = 0 ;
2010-12-13 22:09:48 +00:00
2011-02-11 20:02:08 +00:00
if ( myConfig -> readConfigInt ( "LogOnOff" )) {
//if write logfiles is enabled
2010-12-13 22:09:48 +00:00
2011-02-11 20:02:08 +00:00
QDir logDir ( QString :: fromUtf8 ( myConfig -> readConfigString ( "LogDir" ). c_str ()));
2010-12-13 22:09:48 +00:00
2011-02-11 20:02:08 +00:00
if ( myConfig -> readConfigString ( "LogDir" ) != "" && logDir . exists ()) {
2010-12-13 22:09:48 +00:00
2011-02-11 20:02:08 +00:00
int i ;
2010-12-13 22:09:48 +00:00
2011-02-11 20:02:08 +00:00
if ( HTML_LOG ) {
2010-12-13 22:09:48 +00:00
2011-02-11 20:02:08 +00:00
myLogDir = new QDir ( QString :: fromUtf8 ( myConfig -> readConfigString ( "LogDir" ). c_str ()));
QDateTime currentTime = QDateTime :: currentDateTime ();
2011-11-25 21:51:27 +00:00
if ( SQLITE_LOG ) {
2011-12-22 00:29:21 +00:00
myHtmlLogFile_old = new QFile ( myLogDir -> absolutePath () + "/pokerth-log-" + currentTime . toString ( "yyyy-MM-dd_hh.mm.ss" ) + "_old.html" );
2011-11-25 21:51:27 +00:00
} else {
2011-12-22 00:29:21 +00:00
myHtmlLogFile_old = new QFile ( myLogDir -> absolutePath () + "/pokerth-log-" + currentTime . toString ( "yyyy-MM-dd_hh.mm.ss" ) + ".html" );
2011-11-25 21:51:27 +00:00
}
2010-12-13 22:09:48 +00:00
2011-02-11 20:02:08 +00:00
//Logo-Pixmap extrahieren
QPixmap logoChipPixmapFile ( ":/gfx/logoChip3D.png" );
logoChipPixmapFile . save ( myLogDir -> absolutePath () + "/logo.png" );
2010-12-13 22:09:48 +00:00
2011-12-22 00:29:21 +00:00
// myW->textBrowser_Log->append(myHtmlLogFile_old->fileName());
2010-12-13 22:09:48 +00:00
2011-02-11 20:02:08 +00:00
// erstelle html-Datei
2011-12-22 00:29:21 +00:00
myHtmlLogFile_old -> open ( QIODevice :: WriteOnly );
QTextStream stream_old ( myHtmlLogFile_old );
stream_old << "<html> \n " ;
stream_old << "<head> \n " ;
stream_old << "<meta http-equiv= \" Content-Type \" content= \" text/html; charset=utf8 \" >" ;
stream_old << "</head> \n " ;
stream_old << "<body style= \" font-size:smaller \" > \n " ;
stream_old << "<img src='logo.png'> \n " ;
stream_old << QString ( "<h3><b>Log-File for PokerTH %1 Session started on " ). arg ( POKERTH_BETA_RELEASE_STRING ) + QDate :: currentDate (). toString ( "yyyy-MM-dd" ) + " at " + QTime :: currentTime (). toString ( "hh:mm:ss" ) + "</b></h3> \n " ;
myHtmlLogFile_old -> close ();
2010-12-13 22:09:48 +00:00
2011-02-11 20:02:08 +00:00
}
2010-12-13 22:09:48 +00:00
2011-02-11 20:02:08 +00:00
// delete old log files
int daysUntilWaste = myConfig -> readConfigInt ( "LogStoreDuration" );
2010-12-13 22:09:48 +00:00
2011-02-11 20:02:08 +00:00
QStringList filters ( "pokerth-log*" );
QStringList logFileList = myLogDir -> entryList ( filters , QDir :: Files );
2010-12-13 22:09:48 +00:00
2011-02-11 20:02:08 +00:00
for ( i = 0 ; i < logFileList . count (); i ++ ) {
2010-12-13 22:09:48 +00:00
// cout << logFileList.at(i).toStdString() << endl;
2011-02-11 20:02:08 +00:00
QString dateString = logFileList . at ( i );
dateString . remove ( "pokerth-log-" );
dateString . remove ( 10 , 14 );
2010-12-13 22:09:48 +00:00
2011-02-11 20:02:08 +00:00
QDate dateOfFile ( QDate :: fromString ( dateString , Qt :: ISODate ));
QDate today ( QDate :: currentDate ());
2010-12-13 22:09:48 +00:00
// cout << dateOfFile.daysTo(today) << endl;
2011-02-11 20:02:08 +00:00
if ( dateOfFile . daysTo ( today ) > daysUntilWaste ) {
2010-12-13 22:09:48 +00:00
2011-02-11 20:02:08 +00:00
// cout << QString::QString(myLogDir->absolutePath()+"/"+logFileList.at(i)).toStdString() << endl;
QFile fileToDelete ( myLogDir -> absolutePath () + "/" + logFileList . at ( i ));
fileToDelete . remove ();
}
2010-12-13 22:09:48 +00:00
2011-02-11 20:02:08 +00:00
}
2010-12-13 22:09:48 +00:00
2011-02-11 20:02:08 +00:00
} else {
cout << "Log directory doesn't exist. Cannot create log files" ;
}
}
2010-12-13 22:09:48 +00:00
}
guiLog ::~ guiLog ()
{
2011-02-11 20:02:08 +00:00
delete myLogDir ;
delete myHtmlLogFile ;
2011-12-22 00:29:21 +00:00
delete myHtmlLogFile_old ;
2010-12-13 22:09:48 +00:00
}
2011-02-27 16:34:39 +00:00
void guiLog :: logPlayerActionMsg ( QString msg , int action , int setValue )
2011-02-11 20:02:08 +00:00
{
2010-12-13 22:09:48 +00:00
switch ( action ) {
2011-02-11 20:02:08 +00:00
case 1 :
msg += " folds." ;
2010-12-13 22:09:48 +00:00
break ;
2011-02-11 20:02:08 +00:00
case 2 :
msg += " checks." ;
2010-12-13 22:09:48 +00:00
break ;
2011-02-11 20:02:08 +00:00
case 3 :
msg += " calls " ;
2010-12-13 22:09:48 +00:00
break ;
2011-02-11 20:02:08 +00:00
case 4 :
msg += " bets " ;
2010-12-13 22:09:48 +00:00
break ;
2011-02-11 20:02:08 +00:00
case 5 :
msg += " bets " ;
2010-12-13 22:09:48 +00:00
break ;
2011-02-11 20:02:08 +00:00
case 6 :
msg += " is all in with " ;
2010-12-13 22:09:48 +00:00
break ;
2011-02-11 20:02:08 +00:00
default :
msg += "ERROR" ;
2010-12-13 22:09:48 +00:00
}
2011-02-11 20:02:08 +00:00
if ( action >= 3 ) {
msg += "$" + QString :: number ( setValue , 10 ) + "." ;
}
myW -> textBrowser_Log -> append ( "<span style= \" color:#" + myStyle -> getChatLogTextColor () + "; \" >" + msg + "</span>" );
2010-12-13 22:09:48 +00:00
if ( myConfig -> readConfigInt ( "LogOnOff" )) {
2011-02-11 20:02:08 +00:00
//if write logfiles is enabled
2010-12-13 22:09:48 +00:00
2011-02-11 20:02:08 +00:00
if ( HTML_LOG ) {
2010-12-13 22:09:48 +00:00
2011-02-11 20:02:08 +00:00
logFileStreamString += msg + "</br> \n " ;
2010-12-13 22:09:48 +00:00
2011-02-11 20:02:08 +00:00
if ( myConfig -> readConfigInt ( "LogInterval" ) == 0 ) {
writeLogFileStream ( logFileStreamString );
logFileStreamString = "" ;
}
2010-12-13 22:09:48 +00:00
2011-02-11 20:02:08 +00:00
}
2010-12-13 22:09:48 +00:00
}
}
2011-02-11 20:02:08 +00:00
void guiLog :: logNewGameHandMsg ( int gameID , int handID )
{
2010-12-13 22:09:48 +00:00
PlayerListConstIterator it_c ;
2011-01-09 14:16:20 +00:00
boost :: shared_ptr < HandInterface > currentHand = myW -> getSession () -> getCurrentGame () -> getCurrentHand ();
2010-12-13 22:09:48 +00:00
2011-02-11 20:02:08 +00:00
PlayerList activePlayerList = currentHand -> getActivePlayerList ();
2011-01-11 23:13:55 +00:00
2011-02-11 20:02:08 +00:00
myW -> textBrowser_Log -> append ( "<span style= \" color:#" + myStyle -> getChatLogTextColor () + "; font-size:large; font-weight:bold \" >## Game: " + QString :: number ( gameID , 10 ) + " | Hand: " + QString :: number ( handID , 10 ) + " ##</span>" );
2010-12-13 22:09:48 +00:00
if ( myConfig -> readConfigInt ( "LogOnOff" )) {
2011-02-11 20:02:08 +00:00
//if write logfiles is enabled
2010-12-13 22:09:48 +00:00
2011-02-11 20:02:08 +00:00
if ( HTML_LOG ) {
2010-12-13 22:09:48 +00:00
2011-02-11 20:02:08 +00:00
logFileStreamString += "<table><tr><td width= \" 600 \" align= \" center \" ><hr noshade size= \" 3 \" ><b>Game: " + QString :: number ( gameID , 10 ) + " | Hand: " + QString :: number ( handID , 10 ) + "</b></td><td></td></tr></table>" ;
logFileStreamString += "BLIND LEVEL: $" + QString :: number ( currentHand -> getSmallBlind ()) + " / $" + QString :: number ( currentHand -> getSmallBlind () * 2 ) + "</br>" ;
2010-12-13 22:09:48 +00:00
2011-02-11 20:02:08 +00:00
//print cash only for active players
2011-02-09 14:33:39 +00:00
for ( it_c = activePlayerList -> begin (); it_c != activePlayerList -> end (); ++ it_c ) {
2010-12-13 22:09:48 +00:00
2011-02-11 20:02:08 +00:00
logFileStreamString += "Seat " + QString :: number (( * it_c ) -> getMyID () + 1 , 10 ) + ": <b>" + QString :: fromUtf8 (( * it_c ) -> getMyName (). c_str ()) + "</b> ($" + QString :: number (( * it_c ) -> getMyCash () + ( * it_c ) -> getMySet (), 10 ) + ")</br>" ;
2010-12-13 22:09:48 +00:00
2011-02-11 20:02:08 +00:00
}
2010-12-13 22:09:48 +00:00
2011-02-11 20:02:08 +00:00
}
2010-12-13 22:09:48 +00:00
}
}
2011-02-11 20:02:08 +00:00
void guiLog :: logNewBlindsSetsMsg ( int sbSet , int bbSet , QString sbName , QString bbName )
{
2010-12-13 22:09:48 +00:00
2011-02-11 20:02:08 +00:00
// log blinds
myW -> textBrowser_Log -> append ( "<span style= \" color:#" + myStyle -> getChatLogTextColor () + "; \" >" + sbName + " posts small blind ($" + QString :: number ( sbSet , 10 ) + ")</span>" );
myW -> textBrowser_Log -> append ( "<span style= \" color:#" + myStyle -> getChatLogTextColor () + "; \" >" + bbName + " posts big blind ($" + QString :: number ( bbSet , 10 ) + ")</span>" );
2010-12-13 22:09:48 +00:00
2011-02-11 20:02:08 +00:00
if ( myConfig -> readConfigInt ( "LogOnOff" )) {
//if write logfiles is enabled
2010-12-13 22:09:48 +00:00
2011-02-11 20:02:08 +00:00
if ( HTML_LOG ) {
2010-12-13 22:09:48 +00:00
2011-02-11 20:02:08 +00:00
logFileStreamString += "BLINDS: " ;
2010-12-13 22:09:48 +00:00
2011-02-11 20:02:08 +00:00
logFileStreamString += sbName + " ($" + QString :: number ( sbSet , 10 ) + "), " ;
logFileStreamString += bbName + " ($" + QString :: number ( bbSet , 10 ) + ")" ;
2010-12-13 22:09:48 +00:00
2011-02-11 20:02:08 +00:00
PlayerListConstIterator it_c ;
2011-01-12 22:37:33 +00:00
boost :: shared_ptr < Game > currentGame = myW -> getSession () -> getCurrentGame ();
PlayerList activePlayerList = currentGame -> getActivePlayerList ();
2011-01-11 23:13:55 +00:00
2011-02-09 14:33:39 +00:00
for ( it_c = activePlayerList -> begin (); it_c != activePlayerList -> end (); ++ it_c ) {
2011-01-11 23:13:55 +00:00
2011-02-11 20:02:08 +00:00
if ( activePlayerList -> size () > 2 ) {
if (( * it_c ) -> getMyButton () == BUTTON_DEALER ) {
2010-12-13 22:09:48 +00:00
2011-02-11 20:02:08 +00:00
logFileStreamString += "</br>" + QString :: fromUtf8 (( * it_c ) -> getMyName (). c_str ()) + " starts as dealer." ;
break ;
}
} else {
if (( * it_c ) -> getMyButton () == BUTTON_SMALL_BLIND ) {
2010-12-13 22:09:48 +00:00
2011-02-11 20:02:08 +00:00
logFileStreamString += "</br>" + QString :: fromUtf8 (( * it_c ) -> getMyName (). c_str ()) + " starts as dealer." ;
break ;
}
}
}
2010-12-13 22:09:48 +00:00
2011-02-11 20:02:08 +00:00
logFileStreamString += "</br></br><b>PREFLOP</b>" ;
logFileStreamString += "</br> \n " ;
2010-12-13 22:09:48 +00:00
2011-02-11 20:02:08 +00:00
}
2010-12-13 22:09:48 +00:00
2011-02-11 20:02:08 +00:00
}
2010-12-13 22:09:48 +00:00
}
2011-02-11 20:02:08 +00:00
void guiLog :: logPlayerWinsMsg ( QString playerName , int pot , bool main )
{
2010-12-13 22:09:48 +00:00
if ( main ) {
myW -> textBrowser_Log -> append ( "<span style= \" color:#" + myStyle -> getLogWinnerMainPotColor () + "; \" >" + playerName + " wins $" + QString :: number ( pot , 10 ) + "</span>" );
} else {
myW -> textBrowser_Log -> append ( "<span style= \" color:#" + myStyle -> getLogWinnerSidePotColor () + "; \" >" + playerName + " wins $" + QString :: number ( pot , 10 ) + " (side pot)</span>" );
}
2011-02-11 20:02:08 +00:00
2010-12-13 22:09:48 +00:00
if ( myConfig -> readConfigInt ( "LogOnOff" )) {
2011-02-11 20:02:08 +00:00
//if write logfiles is enabled
2010-12-13 22:09:48 +00:00
logFileStreamString += "</br><i>" + playerName + " wins $" + QString :: number ( pot , 10 );
if ( ! main ) {
logFileStreamString += " (side pot)" ;
}
logFileStreamString += "</i> \n " ;
2011-02-11 20:02:08 +00:00
if ( myConfig -> readConfigInt ( "LogInterval" ) == 0 ) {
2010-12-13 22:09:48 +00:00
writeLogFileStream ( logFileStreamString );
logFileStreamString = "" ;
}
}
}
2011-02-11 20:02:08 +00:00
void guiLog :: logPlayerSitsOut ( QString playerName )
{
2010-12-13 22:09:48 +00:00
myW -> textBrowser_Log -> append ( "<i><span style= \" color:#" + myStyle -> getLogPlayerSitsOutColor () + "; \" >" + playerName + " sits out</span></i>" );
2011-02-11 20:02:08 +00:00
2010-12-13 22:09:48 +00:00
if ( myConfig -> readConfigInt ( "LogOnOff" )) {
logFileStreamString += "</br><i><span style= \" font-size:smaller; \" >" + playerName + " sits out</span></i> \n " ;
2011-02-11 20:02:08 +00:00
if ( myConfig -> readConfigInt ( "LogInterval" ) == 0 ) {
2010-12-13 22:09:48 +00:00
writeLogFileStream ( logFileStreamString );
logFileStreamString = "" ;
}
}
}
2011-02-11 20:02:08 +00:00
void guiLog :: logDealBoardCardsMsg ( int roundID , int card1 , int card2 , int card3 , int card4 , int card5 )
{
2010-12-13 22:09:48 +00:00
QString round ;
2011-02-11 20:02:08 +00:00
2010-12-13 22:09:48 +00:00
switch ( roundID ) {
2011-02-11 20:02:08 +00:00
case 1 :
round = "Flop" ;
myW -> textBrowser_Log -> append ( "<span style= \" color:#" + myStyle -> getLogPlayerSitsOutColor () + "; \" >--- " + round + " --- " + "[" + translateCardCode ( card1 ). at ( 0 ) + translateCardCode ( card1 ). at ( 1 ) + "," + translateCardCode ( card2 ). at ( 0 ) + translateCardCode ( card2 ). at ( 1 ) + "," + translateCardCode ( card3 ). at ( 0 ) + translateCardCode ( card3 ). at ( 1 ) + "]</span>" );
2010-12-13 22:09:48 +00:00
break ;
2011-02-11 20:02:08 +00:00
case 2 :
round = "Turn" ;
myW -> textBrowser_Log -> append ( "<span style= \" color:#" + myStyle -> getLogPlayerSitsOutColor () + "; \" >--- " + round + " --- " + "[" + translateCardCode ( card1 ). at ( 0 ) + translateCardCode ( card1 ). at ( 1 ) + "," + translateCardCode ( card2 ). at ( 0 ) + translateCardCode ( card2 ). at ( 1 ) + "," + translateCardCode ( card3 ). at ( 0 ) + translateCardCode ( card3 ). at ( 1 ) + "," + translateCardCode ( card4 ). at ( 0 ) + translateCardCode ( card4 ). at ( 1 ) + "]</span>" );
2010-12-13 22:09:48 +00:00
break ;
2011-02-11 20:02:08 +00:00
case 3 :
round = "River" ;
myW -> textBrowser_Log -> append ( "<span style= \" color:#" + myStyle -> getLogPlayerSitsOutColor () + "; \" >--- " + round + " --- " + "[" + translateCardCode ( card1 ). at ( 0 ) + translateCardCode ( card1 ). at ( 1 ) + "," + translateCardCode ( card2 ). at ( 0 ) + translateCardCode ( card2 ). at ( 1 ) + "," + translateCardCode ( card3 ). at ( 0 ) + translateCardCode ( card3 ). at ( 1 ) + "," + translateCardCode ( card4 ). at ( 0 ) + translateCardCode ( card4 ). at ( 1 ) + "," + translateCardCode ( card5 ). at ( 0 ) + translateCardCode ( card5 ). at ( 1 ) + "]</span>" );
2010-12-13 22:09:48 +00:00
break ;
2011-02-11 20:02:08 +00:00
default :
round = "ERROR" ;
2010-12-13 22:09:48 +00:00
}
if ( myConfig -> readConfigInt ( "LogOnOff" )) {
2011-02-11 20:02:08 +00:00
//if write logfiles is enabled
2010-12-13 22:09:48 +00:00
2011-02-11 20:02:08 +00:00
if ( HTML_LOG ) {
2010-12-13 22:09:48 +00:00
2011-02-11 20:02:08 +00:00
switch ( roundID ) {
2010-12-13 22:09:48 +00:00
2011-02-11 20:02:08 +00:00
case 1 :
round = "Flop" ;
logFileStreamString += "</br><b>" + round . toUpper () + "</b> [board cards <b>" + translateCardCode ( card1 ). at ( 0 ) + "</b>" + translateCardCode ( card1 ). at ( 1 ) + ",<b>" + translateCardCode ( card2 ). at ( 0 ) + "</b>" + translateCardCode ( card2 ). at ( 1 ) + ",<b>" + translateCardCode ( card3 ). at ( 0 ) + "</b>" + translateCardCode ( card3 ). at ( 1 ) + "]" + "</br> \n " ;
break ;
case 2 :
round = "Turn" ;
logFileStreamString += "</br><b>" + round . toUpper () + "</b> [board cards <b>" + translateCardCode ( card1 ). at ( 0 ) + "</b>" + translateCardCode ( card1 ). at ( 1 ) + ",<b>" + translateCardCode ( card2 ). at ( 0 ) + "</b>" + translateCardCode ( card2 ). at ( 1 ) + ",<b>" + translateCardCode ( card3 ). at ( 0 ) + "</b>" + translateCardCode ( card3 ). at ( 1 ) + ",<b>" + translateCardCode ( card4 ). at ( 0 ) + "</b>" + translateCardCode ( card4 ). at ( 1 ) + "]" + "</br> \n " ;
break ;
case 3 :
round = "River" ;
logFileStreamString += "</br><b>" + round . toUpper () + "</b> [board cards <b>" + translateCardCode ( card1 ). at ( 0 ) + "</b>" + translateCardCode ( card1 ). at ( 1 ) + ",<b>" + translateCardCode ( card2 ). at ( 0 ) + "</b>" + translateCardCode ( card2 ). at ( 1 ) + ",<b>" + translateCardCode ( card3 ). at ( 0 ) + "</b>" + translateCardCode ( card3 ). at ( 1 ) + ",<b>" + translateCardCode ( card4 ). at ( 0 ) + "</b>" + translateCardCode ( card4 ). at ( 1 ) + ",<b>" + translateCardCode ( card5 ). at ( 0 ) + "</b>" + translateCardCode ( card5 ). at ( 1 ) + "]" + "</br> \n " ;
break ;
default :
round = "ERROR" ;
}
2010-12-13 22:09:48 +00:00
2011-02-11 20:02:08 +00:00
if ( myConfig -> readConfigInt ( "LogInterval" ) == 0 ) {
writeLogFileStream ( logFileStreamString );
logFileStreamString = "" ;
}
2010-12-13 22:09:48 +00:00
2011-02-11 20:02:08 +00:00
}
2010-12-13 22:09:48 +00:00
}
}
2011-02-27 16:34:39 +00:00
void guiLog :: logFlipHoleCardsMsg ( QString playerName , int card1 , int card2 , int cardsValueInt , QString showHas )
2011-02-11 20:02:08 +00:00
{
2010-12-13 22:09:48 +00:00
2011-02-11 20:02:08 +00:00
QString tempHandName ;
2010-12-13 22:09:48 +00:00
if ( cardsValueInt != - 1 ) {
2011-03-20 22:16:57 +00:00
tempHandName = CardsValue :: determineHandName ( cardsValueInt , myW -> getSession () -> getCurrentGame () -> getActivePlayerList ()). c_str ();
2011-02-11 20:02:08 +00:00
2011-11-13 01:05:28 +00:00
myW -> textBrowser_Log -> append ( "<span style= \" color:#" + myStyle -> getChatLogTextColor () + "; \" >" + playerName + " " + showHas + " [" + translateCardCode ( card1 ). at ( 0 ) + translateCardCode ( card1 ). at ( 1 ) + "," + translateCardCode ( card2 ). at ( 0 ) + translateCardCode ( card2 ). at ( 1 ) + "] - \" " + tempHandName + " \" </span>" );
2011-02-11 20:02:08 +00:00
} else {
myW -> textBrowser_Log -> append ( "<span style= \" color:#" + myStyle -> getChatLogTextColor () + "; \" >" + playerName + " " + showHas + " [" + translateCardCode ( card1 ). at ( 0 ) + translateCardCode ( card1 ). at ( 1 ) + "," + translateCardCode ( card2 ). at ( 0 ) + translateCardCode ( card2 ). at ( 1 ) + "]</span>" );
2010-12-13 22:09:48 +00:00
}
2011-02-11 20:02:08 +00:00
if ( myConfig -> readConfigInt ( "LogOnOff" )) {
//if write logfiles is enabled
2010-12-13 22:09:48 +00:00
2011-02-11 20:02:08 +00:00
if ( HTML_LOG ) {
2010-12-13 22:09:48 +00:00
2011-02-11 20:02:08 +00:00
if ( cardsValueInt != - 1 ) {
2010-12-13 22:09:48 +00:00
2011-03-20 22:16:57 +00:00
tempHandName . fromStdString ( CardsValue :: determineHandName ( cardsValueInt , myW -> getSession () -> getCurrentGame () -> getActivePlayerList ()));
2010-12-13 22:09:48 +00:00
2011-02-11 20:02:08 +00:00
logFileStreamString += playerName + " " + showHas + " [ <b>" + translateCardCode ( card1 ). at ( 0 ) + "</b>" + translateCardCode ( card1 ). at ( 1 ) + ",<b>" + translateCardCode ( card2 ). at ( 0 ) + "</b>" + translateCardCode ( card2 ). at ( 1 ) + "] - " + tempHandName + "</br> \n " ;
2010-12-13 22:09:48 +00:00
2011-02-11 20:02:08 +00:00
if ( myConfig -> readConfigInt ( "LogInterval" ) == 0 ) {
writeLogFileStream ( logFileStreamString );
logFileStreamString = "" ;
}
2010-12-13 22:09:48 +00:00
2011-02-11 20:02:08 +00:00
} else {
2010-12-13 22:09:48 +00:00
2011-02-11 20:02:08 +00:00
logFileStreamString += playerName + " " + showHas + " [<b>" + translateCardCode ( card1 ). at ( 0 ) + "</b>" + translateCardCode ( card1 ). at ( 1 ) + ",<b>" + translateCardCode ( card2 ). at ( 0 ) + "</b>" + translateCardCode ( card2 ). at ( 1 ) + "]" + "</br> \n " ;
if ( myConfig -> readConfigInt ( "LogInterval" ) == 0 ) {
writeLogFileStream ( logFileStreamString );
logFileStreamString = "" ;
}
}
}
2010-12-13 22:09:48 +00:00
2011-02-11 20:02:08 +00:00
}
2010-12-13 22:09:48 +00:00
}
2011-02-11 20:02:08 +00:00
void guiLog :: logPlayerLeftMsg ( QString playerName , int wasKicked )
{
2010-12-13 22:09:48 +00:00
QString action ;
if ( wasKicked ) action = "was kicked from" ;
else action = "has left" ;
2011-02-11 20:02:08 +00:00
myW -> textBrowser_Log -> append ( "<span style= \" color:#" + myStyle -> getChatLogTextColor () + "; \" ><i>" + playerName + " " + action + " the game!</i></span>" );
2010-12-13 22:09:48 +00:00
if ( myConfig -> readConfigInt ( "LogOnOff" )) {
2011-02-11 20:02:08 +00:00
2010-12-13 22:09:48 +00:00
logFileStreamString += "<i>" + playerName + " " + action + " the game!</i><br> \n " ;
2011-02-11 20:02:08 +00:00
if ( myConfig -> readConfigInt ( "LogInterval" ) == 0 ) {
2010-12-13 22:09:48 +00:00
writeLogFileStream ( logFileStreamString );
logFileStreamString = "" ;
}
}
}
2011-02-11 20:02:08 +00:00
void guiLog :: logNewGameAdminMsg ( QString playerName )
{
2010-12-13 22:09:48 +00:00
myW -> textBrowser_Log -> append ( "<i><span style= \" color:#" + myStyle -> getLogNewGameAdminColor () + "; \" >" + playerName + " is game admin now!</span></i>" );
2011-02-11 20:02:08 +00:00
2010-12-13 22:09:48 +00:00
if ( myConfig -> readConfigInt ( "LogOnOff" )) {
2011-02-11 20:02:08 +00:00
2010-12-13 22:09:48 +00:00
logFileStreamString += "<i>" + playerName + " is game admin now!</i><br> \n " ;
2011-02-11 20:02:08 +00:00
if ( myConfig -> readConfigInt ( "LogInterval" ) == 0 ) {
2010-12-13 22:09:48 +00:00
writeLogFileStream ( logFileStreamString );
logFileStreamString = "" ;
}
}
}
2011-11-01 00:02:12 +00:00
void guiLog :: logPlayerJoinedMsg ( QString playerName )
{
myW -> textBrowser_Log -> append ( "<span style= \" color:#" + myStyle -> getChatLogTextColor () + "; \" ><i>" + playerName + " has joined the game!</i></span>" );
}
2011-02-11 20:02:08 +00:00
void guiLog :: logPlayerWinGame ( QString playerName , int gameID )
{
2010-12-13 22:09:48 +00:00
myW -> textBrowser_Log -> append ( "<i><b>" + playerName + " wins game " + QString :: number ( gameID , 10 ) + "!</i></b><br>" );
2011-02-11 20:02:08 +00:00
2010-12-13 22:09:48 +00:00
if ( myConfig -> readConfigInt ( "LogOnOff" )) {
2011-02-11 20:02:08 +00:00
2010-12-13 22:09:48 +00:00
logFileStreamString += "</br></br><i><b>" + playerName + " wins game " + QString :: number ( gameID , 10 ) + "!</i></b></br> \n " ;
2011-02-11 20:02:08 +00:00
if ( myConfig -> readConfigInt ( "LogInterval" ) == 0 ) {
2010-12-13 22:09:48 +00:00
writeLogFileStream ( logFileStreamString );
logFileStreamString = "" ;
}
}
}
2011-02-11 20:02:08 +00:00
QStringList guiLog :: translateCardCode ( int cardCode )
{
2010-12-13 22:09:48 +00:00
int value = cardCode % 13 ;
int color = cardCode / 13 ;
2011-02-11 20:02:08 +00:00
2010-12-13 22:09:48 +00:00
QStringList cardString ;
2011-02-11 20:02:08 +00:00
2010-12-13 22:09:48 +00:00
switch ( value ) {
2011-02-11 20:02:08 +00:00
case 0 :
cardString << "2" ;
2010-12-13 22:09:48 +00:00
break ;
2011-02-11 20:02:08 +00:00
case 1 :
cardString << "3" ;
2010-12-13 22:09:48 +00:00
break ;
2011-02-11 20:02:08 +00:00
case 2 :
cardString << "4" ;
2010-12-13 22:09:48 +00:00
break ;
2011-02-11 20:02:08 +00:00
case 3 :
cardString << "5" ;
2010-12-13 22:09:48 +00:00
break ;
2011-02-11 20:02:08 +00:00
case 4 :
cardString << "6" ;
2010-12-13 22:09:48 +00:00
break ;
2011-02-11 20:02:08 +00:00
case 5 :
cardString << "7" ;
2010-12-13 22:09:48 +00:00
break ;
2011-02-11 20:02:08 +00:00
case 6 :
cardString << "8" ;
2010-12-13 22:09:48 +00:00
break ;
2011-02-11 20:02:08 +00:00
case 7 :
cardString << "9" ;
2010-12-13 22:09:48 +00:00
break ;
2011-02-11 20:02:08 +00:00
case 8 :
cardString << "T" ;
2010-12-13 22:09:48 +00:00
break ;
2011-02-11 20:02:08 +00:00
case 9 :
cardString << "J" ;
2010-12-13 22:09:48 +00:00
break ;
2011-02-11 20:02:08 +00:00
case 10 :
cardString << "Q" ;
2010-12-13 22:09:48 +00:00
break ;
2011-02-11 20:02:08 +00:00
case 11 :
cardString << "K" ;
2010-12-13 22:09:48 +00:00
break ;
2011-02-11 20:02:08 +00:00
case 12 :
cardString << "A" ;
2010-12-13 22:09:48 +00:00
break ;
2011-02-11 20:02:08 +00:00
default :
cardString << "ERROR" ;
2010-12-13 22:09:48 +00:00
}
switch ( color ) {
2011-02-11 20:02:08 +00:00
case 0 :
cardString << "d" ;
2010-12-13 22:09:48 +00:00
break ;
2011-02-11 20:02:08 +00:00
case 1 :
cardString << "h" ;
2010-12-13 22:09:48 +00:00
break ;
2011-02-11 20:02:08 +00:00
case 2 :
cardString << "s" ;
2010-12-13 22:09:48 +00:00
break ;
2011-02-11 20:02:08 +00:00
case 3 :
cardString << "c" ;
2010-12-13 22:09:48 +00:00
break ;
2011-02-11 20:02:08 +00:00
default :
cardString << "ERROR" ;
2010-12-13 22:09:48 +00:00
}
2011-02-11 20:02:08 +00:00
2010-12-13 22:09:48 +00:00
return cardString ;
}
2011-02-11 20:02:08 +00:00
void guiLog :: writeLogFileStream ( QString streamString )
{
2010-12-13 22:09:48 +00:00
2011-12-22 00:29:21 +00:00
if ( myHtmlLogFile_old ) {
if ( myHtmlLogFile_old -> open ( QIODevice :: ReadWrite )) {
QTextStream stream_old ( myHtmlLogFile_old );
stream_old . readAll ();
stream_old << streamString ;
myHtmlLogFile_old -> close ();
2011-02-11 20:02:08 +00:00
} else {
cout << "Could not open log-file to write log-messages!" << endl ;
2010-12-13 22:09:48 +00:00
}
2011-02-11 20:02:08 +00:00
} else {
cout << "Could not find log-file to write log-messages!" << endl ;
2010-12-13 22:09:48 +00:00
}
}
2011-12-22 00:29:21 +00:00
void guiLog :: writeLogFileStream ( string log_string , QFile * LogFile )
{
QTextStream stream ( LogFile );
stream . readAll ();
stream << log_string . data ();
}
void guiLog :: writeLog ( string log_string , int modus )
{
switch ( modus ) {
case 1 :
writeLogFileStream ( log_string , myHtmlLogFile );
break ;
case 2 :
writeLogFileStream ( log_string , myTxtLogFile );
break ;
case 3 :
tb -> append ( log_string . data ());
break ;
default :
;
}
}
2011-02-11 20:02:08 +00:00
void guiLog :: flushLogAtHand ()
{
2010-12-13 22:09:48 +00:00
if ( myConfig -> readConfigInt ( "LogOnOff" )) {
if ( myConfig -> readConfigInt ( "LogInterval" ) < 2 ) {
2011-02-11 20:02:08 +00:00
// write for log after every action and after every hand
2010-12-13 22:09:48 +00:00
writeLogFileStream ( logFileStreamString );
logFileStreamString = "" ;
}
}
}
2011-02-11 20:02:08 +00:00
void guiLog :: flushLogAtGame ( int gameID )
{
2010-12-13 22:09:48 +00:00
2011-02-11 20:02:08 +00:00
if ( myConfig -> readConfigInt ( "LogOnOff" )) {
// write for log after every game
if ( gameID > lastGameID ) {
writeLogFileStream ( logFileStreamString );
logFileStreamString = "" ;
lastGameID = gameID ;
}
}
2010-12-13 22:09:48 +00:00
}
2011-11-25 21:51:27 +00:00
2011-12-22 00:29:21 +00:00
void guiLog :: exportLogPdbToHtml ( QString fileStringPdb , QString exportFileString )
2011-11-25 21:51:27 +00:00
{
2011-12-22 00:29:21 +00:00
myHtmlLogFile = new QFile ( exportFileString );
myHtmlLogFile -> open ( QIODevice :: ReadWrite | QFile :: Truncate );
string log_string = "<html> \n " ;
log_string += "<head> \n " ;
log_string += "<meta http-equiv= \" Content-Type \" content= \" text/html; charset=utf8 \" >" ;
log_string += "</head> \n " ;
log_string += "<body style= \" font-size:smaller \" > \n " ;
writeLog ( log_string , 1 );
exportLog ( fileStringPdb , 1 );
myHtmlLogFile -> close ();
2011-11-25 21:51:27 +00:00
}
2011-12-22 00:29:21 +00:00
void guiLog :: exportLogPdbToTxt ( QString fileStringPdb , QString exportFileString )
2011-11-25 21:51:27 +00:00
{
2011-12-22 00:29:21 +00:00
myTxtLogFile = new QFile ( exportFileString );
myTxtLogFile -> open ( QIODevice :: ReadWrite | QFile :: Truncate );
exportLog ( fileStringPdb , 2 );
myTxtLogFile -> close ();
2011-11-25 21:51:27 +00:00
}
2011-12-22 00:29:21 +00:00
void guiLog :: showLog ( QString fileStringPdb , QTextBrowser * tb_tmp )
2011-11-25 21:51:27 +00:00
{
2011-12-22 00:29:21 +00:00
tb = tb_tmp ;
2011-11-26 21:07:22 +00:00
tb -> clear ();
2011-12-22 00:29:21 +00:00
exportLog ( fileStringPdb , 3 );
}
int guiLog :: exportLog ( QString fileStringPdb , int modus )
{
bool neu = false ;
string sql = "" ;
string log_string = "" ;
bool data_found = false ;
char ** result_Session = 0 , ** result_Game = 0 , ** result_Hand = 0 , ** result_Hand_ID = 0 , ** result_Action = 0 ;
int nRow_Session = 0 , nRow_Game = 0 , nRow_Hand = 0 , nRow_Hand_ID = 0 , nRow_Action = 0 ;
int nCol_Session = 0 , nCol_Game = 0 , nCol_Hand = 0 , nCol_Action = 0 ;
char * errmsg = 0 ;
int game_ctr = 0 , hand_ctr = 0 , round_ctr = 0 , action_ctr = 0 ;
int i = 0 , j = 0 ;
int gameID = 0 ;
string cmpString = "" , string_tmp = "" ;
string player [ MAX_NUMBER_OF_PLAYERS ];
for ( i = 1 ; i <= MAX_NUMBER_OF_PLAYERS ; i ++ ) {
player [ i - 1 ] = "" ;
2011-11-26 21:07:22 +00:00
}
2011-11-25 21:51:27 +00:00
2011-12-22 00:29:21 +00:00
// open sqlite log-db
sqlite3 * mySqliteLogDb ;
sqlite3_open ( fileStringPdb . toStdString (). data (), & mySqliteLogDb );
if ( mySqliteLogDb != 0 ) {
// read session
sql = "SELECT * FROM Session" ;
if ( sqlite3_get_table ( mySqliteLogDb , sql . data (), & result_Session , & nRow_Session , & nCol_Session , & errmsg ) != SQLITE_OK ) {
cout << "Error in statement: " << sql . data () << "[" << errmsg << "]." << endl ;
sqlite3_close ( mySqliteLogDb );
return 1 ;
}
if ( nRow_Session < 1 || nRow_Session > 1 ) {
cout << "Number of Sessions implausible!" << endl ;
sqlite3_close ( mySqliteLogDb );
return 1 ;
}
log_string += "Log-File for PokerTH " ;
// pokerth version
data_found = false ;
for ( i = 0 ; i < nCol_Session ; i ++ ) {
if ( boost :: lexical_cast < std :: string > ( result_Session [ i ]) == "PokerTH_Version" ) {
log_string += boost :: lexical_cast < std :: string > ( result_Session [ i + nCol_Session ]);
data_found = true ;
}
}
if ( ! data_found ) {
cout << "Missing PokerTH version information!" << endl ;
sqlite3_close ( mySqliteLogDb );
return 1 ;
}
log_string += " Session started on " ;
// logging date
data_found = false ;
for ( i = 0 ; i < nCol_Session ; i ++ ) {
if ( boost :: lexical_cast < std :: string > ( result_Session [ i ]) == "Date" ) {
log_string += boost :: lexical_cast < std :: string > ( result_Session [ i + nCol_Session ]);
data_found = true ;
}
}
if ( ! data_found ) {
cout << "Missing date information!" << endl ;
sqlite3_close ( mySqliteLogDb );
return 1 ;
}
log_string += " at " ;
// logging time
data_found = false ;
for ( i = 0 ; i < nCol_Session ; i ++ ) {
if ( boost :: lexical_cast < std :: string > ( result_Session [ i ]) == "Time" ) {
log_string += boost :: lexical_cast < std :: string > ( result_Session [ i + nCol_Session ]);
data_found = true ;
}
}
if ( ! data_found ) {
cout << "Missing time information!" << endl ;
sqlite3_close ( mySqliteLogDb );
return 1 ;
}
sqlite3_free_table ( result_Session );
switch ( modus ) {
case 1 :
log_string = "<h3><b>" + log_string + "</b></h3>" ;
if ( ! neu ) log_string = "<img src='logo.png'>" + log_string ;
break ;
case 2 :
log_string += " \n " ;
break ;
case 3 :
log_string = "<h4><b>" + log_string + "</b></h4>" ;
break ;
default :
;
}
writeLog ( log_string , modus );
log_string = "" ;
// read game
sql = "SELECT * FROM Game" ;
if ( sqlite3_get_table ( mySqliteLogDb , sql . data (), & result_Game , & nRow_Game , & nCol_Game , & errmsg ) != SQLITE_OK ) {
cout << "Error in statement: " << sql . data () << "[" << errmsg << "]." << endl ;
sqlite3_close ( mySqliteLogDb );
return 1 ;
}
// run through all games
for ( game_ctr = 1 ; game_ctr <= nRow_Game ; game_ctr ++ ) {
// game id
data_found = false ;
for ( i = 0 ; i < nCol_Game ; i ++ ) {
if ( boost :: lexical_cast < std :: string > ( result_Game [ i ]) == "GameID" ) {
gameID = boost :: lexical_cast < int > ( result_Game [ i + nCol_Game * game_ctr ]);
data_found = true ;
}
}
if ( ! data_found ) {
sqlite3_close ( mySqliteLogDb );
return 1 ;
}
// read player
for ( i = 1 ; i <= MAX_NUMBER_OF_PLAYERS ; i ++ ) {
data_found = false ;
for ( j = 0 ; j < nCol_Game ; j ++ ) {
cmpString = "Seat_" ;
cmpString += boost :: lexical_cast < std :: string > ( i );
if ( boost :: lexical_cast < std :: string > ( result_Game [ j ]) == cmpString ) {
// Seat found
if ( result_Game [ j + nCol_Game * game_ctr ]) {
// the Seat is not empty
player [ i - 1 ] = boost :: lexical_cast < std :: string > ( result_Game [ j + nCol_Game * game_ctr ]);
} else {
player [ i - 1 ] = "" ;
}
data_found = true ;
}
}
if ( ! data_found ) {
cout << "Missing some seats!" << endl ;
sqlite3_close ( mySqliteLogDb );
return 1 ;
}
}
// read all hand id
sql = "SELECT HandID FROM Hand WHERE GameID=" ;
sql += boost :: lexical_cast < std :: string > ( gameID );
if ( sqlite3_get_table ( mySqliteLogDb , sql . data (), & result_Hand_ID , & nRow_Hand_ID , & nCol_Hand , & errmsg ) != SQLITE_OK ) {
cout << "Error in statement: " << sql . data () << "[" << errmsg << "]." << endl ;
sqlite3_close ( mySqliteLogDb );
return 1 ;
}
// run through all hands
for ( hand_ctr = 1 ; hand_ctr <= nRow_Hand_ID - 1 ; hand_ctr ++ ) {
// log game and hand id
log_string += "Game: " ;
log_string += boost :: lexical_cast < std :: string > ( gameID );
log_string += " | Hand: " ;
log_string += boost :: lexical_cast < std :: string > ( result_Hand_ID [ hand_ctr ]);
switch ( modus ) {
case 1 :
log_string = "<table><tr><td width= \" 600 \" align= \" center \" ><hr noshade size= \" 3 \" ><b>" + log_string ;
log_string += "</b></td></tr></table>" ;
break ;
case 2 :
log_string += " \n " ;
break ;
case 3 :
log_string = "----------- <b>" + log_string ;
log_string += "</b> -----------<br />" ;
break ;
default :
;
}
// read current hand
sql = "SELECT * FROM Hand WHERE GameID=" ;
sql += boost :: lexical_cast < std :: string > ( gameID );
sql += " AND HandID=" ;
sql += boost :: lexical_cast < std :: string > ( result_Hand_ID [ hand_ctr ]);
if ( sqlite3_get_table ( mySqliteLogDb , sql . data (), & result_Hand , & nRow_Hand , & nCol_Hand , & errmsg ) != SQLITE_OK ) {
cout << "Error in statement: " << sql . data () << "[" << errmsg << "]." << endl ;
sqlite3_close ( mySqliteLogDb );
return 1 ;
}
// log blind level
log_string += "BLIND LEVEL: $" ;
// read small blind amount
data_found = false ;
for ( i = 0 ; i < nCol_Hand ; i ++ ) {
if ( boost :: lexical_cast < std :: string > ( result_Hand [ i ]) == "Sb_Amount" ) {
log_string += boost :: lexical_cast < std :: string > ( result_Hand [ i + nCol_Hand ]);
data_found = true ;
}
}
if ( ! data_found ) {
cout << "Missing small blind information!" << endl ;
sqlite3_close ( mySqliteLogDb );
return 1 ;
}
log_string += " / $" ;
// read big blind amount
data_found = false ;
for ( i = 0 ; i < nCol_Hand ; i ++ ) {
if ( boost :: lexical_cast < std :: string > ( result_Hand [ i ]) == "Bb_Amount" ) {
log_string += boost :: lexical_cast < std :: string > ( result_Hand [ i + nCol_Hand ]);
data_found = true ;
}
}
if ( ! data_found ) {
cout << "Missing big blind information!" << endl ;
sqlite3_close ( mySqliteLogDb );
return 1 ;
}
switch ( modus ) {
case 1 :
log_string += "<br />" ;
break ;
case 2 :
log_string += " \n " ;
break ;
case 3 :
log_string += "<br />" ;
break ;
default :
;
}
// read seat cash
for ( i = 1 ; i <= MAX_NUMBER_OF_PLAYERS ; i ++ ) {
data_found = false ;
for ( j = 0 ; j < nCol_Hand ; j ++ ) {
cmpString = "Seat_" ;
cmpString += boost :: lexical_cast < std :: string > ( i );
cmpString += "_Cash" ;
if ( boost :: lexical_cast < std :: string > ( result_Hand [ j ]) == cmpString ) { // seat found
if ( result_Hand [ j + nCol_Hand ]) { // player has cash > 0
log_string += "Seat " ;
log_string += boost :: lexical_cast < std :: string > ( i );
log_string += ": " ;
if ( modus == 1 || modus == 3 ) {
log_string += "<b>" ;
}
log_string += player [ i - 1 ];
if ( modus == 1 || modus == 3 ) {
log_string += "</b>" ;
}
log_string += "($" ;
log_string += boost :: lexical_cast < std :: string > ( result_Hand [ j + nCol_Hand ]);
log_string += ")" ;
switch ( modus ) {
case 1 :
log_string += "<br />" ;
break ;
case 2 :
log_string += " \n " ;
break ;
case 3 :
log_string += "<br />" ;
break ;
default :
;
}
}
data_found = true ;
}
}
if ( ! data_found ) {
cout << "Missing seat information in game " << gameID << " and hand " << result_Hand_ID [ hand_ctr ] << "!" << endl ;
sqlite3_close ( mySqliteLogDb );
return 1 ;
}
}
if ( neu ) {
if ( modus == 1 ) log_string += "</br>" ;
// read dealer and blinds
sql = "SELECT Player,Action,Amount FROM Action WHERE GameID=" ;
sql += boost :: lexical_cast < std :: string > ( gameID );
sql += " AND HandID=" ;
sql += boost :: lexical_cast < std :: string > ( result_Hand_ID [ hand_ctr ]);
sql += " AND BeRo=0" ;
if ( sqlite3_get_table ( mySqliteLogDb , sql . data (), & result_Action , & nRow_Action , & nCol_Action , & errmsg ) != SQLITE_OK ) {
cout << "Error in statement: " << sql . data () << "[" << errmsg << "]." << endl ;
sqlite3_close ( mySqliteLogDb );
return 1 ;
}
if ( nRow_Action < 1 ) {
cout << "Missing information about dealer and blinds in game " << gameID << " hand " << result_Hand_ID [ hand_ctr ] << "!" << endl ;
sqlite3_close ( mySqliteLogDb );
return 1 ;
}
// log dealer and blind setting
for ( i = 1 ; i <= nRow_Action ; i ++ ) {
log_string += player [ boost :: lexical_cast < int > ( result_Action [ 3 * i ]) - 1 ];
log_string += " " ;
log_string += boost :: lexical_cast < std :: string > ( result_Action [ 3 * i + 1 ]);
if ( result_Action [ 3 * i + 2 ]) {
// with amount
log_string += " $" ;
log_string += boost :: lexical_cast < std :: string > ( result_Action [ 3 * i + 2 ]);
}
log_string += "." ;
switch ( modus ) {
case 1 :
log_string += "<br />" ;
break ;
case 2 :
log_string += " \n " ;
break ;
case 3 :
;
break ;
default :
;
}
}
sqlite3_free_table ( result_Action );
} else {
log_string += "BLINDS: " ;
// read small blind
sql = "SELECT Player,Amount FROM Action WHERE GameID=" ;
sql += boost :: lexical_cast < std :: string > ( gameID );
sql += " AND HandID=" ;
sql += boost :: lexical_cast < std :: string > ( result_Hand_ID [ hand_ctr ]);
sql += " AND BeRo=0 AND Action='posts small blind'" ;
if ( sqlite3_get_table ( mySqliteLogDb , sql . data (), & result_Action , & nRow_Action , & nCol_Action , & errmsg ) != SQLITE_OK ) {
cout << "Error in statement: " << sql . data () << "[" << errmsg << "]." << endl ;
sqlite3_close ( mySqliteLogDb );
return 1 ;
}
if ( nRow_Action < 1 || nRow_Action > 1 ) {
cout << "Missing information about small blinds in game " << gameID << " hand " << result_Hand_ID [ hand_ctr ] << "!" << endl ;
sqlite3_close ( mySqliteLogDb );
return 1 ;
}
// log small blind
log_string += player [ boost :: lexical_cast < int > ( result_Action [ 2 ]) - 1 ];
log_string += " ($" ;
log_string += boost :: lexical_cast < std :: string > ( result_Action [ 3 ]);
log_string += "), " ;
sqlite3_free_table ( result_Action );
// read big blind
sql = "SELECT Player,Amount FROM Action WHERE GameID=" ;
sql += boost :: lexical_cast < std :: string > ( gameID );
sql += " AND HandID=" ;
sql += boost :: lexical_cast < std :: string > ( result_Hand_ID [ hand_ctr ]);
sql += " AND BeRo=0 AND Action='posts big blind'" ;
if ( sqlite3_get_table ( mySqliteLogDb , sql . data (), & result_Action , & nRow_Action , & nCol_Action , & errmsg ) != SQLITE_OK ) {
cout << "Error in statement: " << sql . data () << "[" << errmsg << "]." << endl ;
sqlite3_close ( mySqliteLogDb );
return 1 ;
}
if ( nRow_Action < 1 || nRow_Action > 1 ) {
cout << "Missing information about small blinds in game " << gameID << " hand " << result_Hand_ID [ hand_ctr ] << "!" << endl ;
sqlite3_close ( mySqliteLogDb );
return 1 ;
}
// log big blind
log_string += player [ boost :: lexical_cast < int > ( result_Action [ 2 ]) - 1 ];
log_string += " ($" ;
log_string += boost :: lexical_cast < std :: string > ( result_Action [ 3 ]);
log_string += ")" ;
sqlite3_free_table ( result_Action );
// read dealer
sql = "SELECT Player,Amount FROM Action WHERE GameID=" ;
sql += boost :: lexical_cast < std :: string > ( gameID );
sql += " AND HandID=" ;
sql += boost :: lexical_cast < std :: string > ( result_Hand_ID [ hand_ctr ]);
sql += " AND BeRo=0 AND Action='starts as dealer'" ;
if ( sqlite3_get_table ( mySqliteLogDb , sql . data (), & result_Action , & nRow_Action , & nCol_Action , & errmsg ) != SQLITE_OK ) {
cout << "Error in statement: " << sql . data () << "[" << errmsg << "]." << endl ;
sqlite3_close ( mySqliteLogDb );
return 1 ;
}
if ( nRow_Action > 1 ) {
cout << "Implausible information about dealer in game " << gameID << " hand " << result_Hand_ID [ hand_ctr ] << "!" << endl ;
sqlite3_close ( mySqliteLogDb );
return 1 ;
}
if ( nRow_Action == 1 ) {
if ( modus == 1 || modus == 3 ) log_string += "<br />" ;
log_string += player [ boost :: lexical_cast < int > ( result_Action [ 2 ]) - 1 ];
log_string += " starts as dealer." ;
}
sqlite3_free_table ( result_Action );
}
writeLog ( log_string , modus );
log_string = "" ;
for ( round_ctr = GAME_STATE_PREFLOP ; round_ctr <= GAME_STATE_POST_RIVER ; round_ctr ++ ) {
// write round name and board cards
if ( round_ctr <= GAME_STATE_RIVER ) {
switch ( round_ctr ) {
case GAME_STATE_PREFLOP :
log_string += "PREFLOP" ;
break ;
case GAME_STATE_FLOP :
log_string += "FLOP" ;
break ;
case GAME_STATE_TURN :
log_string += "TURN" ;
break ;
case GAME_STATE_RIVER :
log_string += "RIVER" ;
break ;
default :
;
}
switch ( modus ) {
case 1 :
log_string = "<br /><b>" + log_string + "</b>" ;
break ;
case 3 :
log_string = "<b>" + log_string + "</b>" ;
break ;
default :
;
}
log_string += " [board cards " ;
for ( i = 1 ; i <= round_ctr + 2 ; i ++ ) {
data_found = false ;
for ( j = 0 ; j < nCol_Hand ; j ++ ) {
if ( boost :: lexical_cast < std :: string > ( result_Hand [ j ]) == "BoardCard_" + boost :: lexical_cast < std :: string > ( i )) {
if ( result_Hand [ j + nCol_Hand ]) {
if ( modus == 1 || modus == 3 ) log_string += "<b>" ;
string_tmp = convertCardIntToString ( boost :: lexical_cast < int > ( result_Hand [ j + nCol_Hand ]));
if ( string_tmp == "" ) {
cout << "Implausible board card in game " << gameID << " hand " << result_Hand_ID [ hand_ctr ] << "!" << endl ;
sqlite3_close ( mySqliteLogDb );
return 1 ;
}
log_string += boost :: lexical_cast < std :: string > ( string_tmp . at ( 0 ));
if ( modus == 1 || modus == 3 ) log_string += "</b>" ;
log_string += boost :: lexical_cast < std :: string > ( string_tmp . at ( 1 ));
if ( round_ctr + 2 - i > 0 ) log_string += "," ;
data_found = true ;
}
}
}
}
log_string += "]" ;
if ( modus == 1 || modus == 3 ) log_string += "<br />" ;
}
// read round action
sql = "SELECT Player,Action,Amount FROM Action WHERE GameID=" ;
sql += boost :: lexical_cast < std :: string > ( gameID );
sql += " AND HandID=" ;
sql += boost :: lexical_cast < std :: string > ( result_Hand_ID [ hand_ctr ]);
sql += " AND BeRo=" ;
sql += boost :: lexical_cast < std :: string > ( round_ctr );
sql += " AND Action<>'starts as dealer' AND Action<>'posts big blind' AND Action<>'posts small blind'" ;
if ( sqlite3_get_table ( mySqliteLogDb , sql . data (), & result_Action , & nRow_Action , & nCol_Action , & errmsg ) != SQLITE_OK ) {
cout << "Error in statement: " << sql . data () << "[" << errmsg << "]." << endl ;
sqlite3_close ( mySqliteLogDb );
return 1 ;
}
for ( action_ctr = 1 ; action_ctr <= nRow_Action ; action_ctr ++ ) {
log_string += player [ boost :: lexical_cast < int > ( result_Action [ 3 * action_ctr ]) - 1 ];
log_string += " " ;
log_string += boost :: lexical_cast < std :: string > ( result_Action [ 3 * action_ctr + 1 ]);
if ( result_Action [ 3 * action_ctr + 2 ]) {
// with amount
log_string += " $" ;
log_string += boost :: lexical_cast < std :: string > ( result_Action [ 3 * action_ctr + 2 ]);
}
// show
if ( boost :: lexical_cast < std :: string > ( result_Action [ 3 * action_ctr + 1 ]) == "shows" ) {
// log cards
log_string += " [" ;
if ( modus == 1 || modus == 3 ) log_string += "<b>" ;
// find hole card 1
data_found = false ;
for ( i = 0 ; i < nCol_Hand ; i ++ ) {
cmpString = "Seat_" ;
cmpString += boost :: lexical_cast < std :: string > ( result_Action [ 3 * action_ctr ]);
cmpString += "_Card_1" ;
if ( boost :: lexical_cast < std :: string > ( result_Hand [ i ]) == cmpString ) {
string_tmp = convertCardIntToString ( boost :: lexical_cast < int > ( result_Hand [ i + nCol_Hand ]));
if ( string_tmp == "" ) {
cout << "Hole card information implausible in game " << gameID << " hand " << result_Hand_ID [ hand_ctr ] << "!" << endl ;
sqlite3_close ( mySqliteLogDb );
return 1 ;
}
log_string += boost :: lexical_cast < std :: string > ( string_tmp . at ( 0 ));
if ( modus == 1 || modus == 3 ) log_string += "</b>" ;
log_string += boost :: lexical_cast < std :: string > ( string_tmp . at ( 1 ));
if ( modus == 1 || modus == 3 ) log_string += ",<b>" ;
data_found = true ;
}
}
if ( ! data_found ) {
cout << "Missing hole card information in game " << gameID << " hand " << result_Hand_ID [ hand_ctr ] << "!" << endl ;
sqlite3_close ( mySqliteLogDb );
return 1 ;
}
// find hole card 2
data_found = false ;
for ( i = 0 ; i < nCol_Hand ; i ++ ) {
cmpString = "Seat_" ;
cmpString += boost :: lexical_cast < std :: string > ( result_Action [ 3 * action_ctr ]);
cmpString += "_Card_2" ;
if ( boost :: lexical_cast < std :: string > ( result_Hand [ i ]) == cmpString ) {
string_tmp = convertCardIntToString ( boost :: lexical_cast < int > ( result_Hand [ i + nCol_Hand ]));
if ( string_tmp == "" ) {
cout << "Hole card information implausible in game " << gameID << " hand " << result_Hand_ID [ hand_ctr ] << "!" << endl ;
sqlite3_close ( mySqliteLogDb );
return 1 ;
}
log_string += boost :: lexical_cast < std :: string > ( string_tmp . at ( 0 ));
if ( modus == 1 || modus == 3 ) log_string += "</b>" ;
log_string += boost :: lexical_cast < std :: string > ( string_tmp . at ( 1 ));
log_string += "]" ;
data_found = true ;
}
}
if ( ! data_found ) {
cout << "Missing hole card information in game " << gameID << " hand " << result_Hand_ID [ hand_ctr ] << "!" << endl ;
sqlite3_close ( mySqliteLogDb );
return 1 ;
}
}
log_string += "." ;
if ( action_ctr < nRow_Action && ( modus == 1 || modus == 3 )) {
log_string += "<br />" ;
}
}
if ( modus == 1 ) log_string += "<br />" ;
sqlite3_free_table ( result_Action );
// log river actions together with post river actions
if ( round_ctr != GAME_STATE_RIVER ) {
writeLog ( log_string , modus );
log_string = "" ;
}
}
}
}
}
/*switch(modus) {
case 1:
break;
case 2:
break;
case 3:
break;
default:
;
}*/
return 0 ;
}
int guiLog :: convertCardStringToInt ( string val , string col )
{
int tmp ;
switch ( * col . data ()) {
case 'd' :
tmp = 0 ;
break ;
case 'h' :
tmp = 13 ;
break ;
case 's' :
tmp = 26 ;
break ;
case 'c' :
tmp = 39 ;
break ;
default :
return - 1 ;
}
switch ( * val . data ()) {
case '2' :
tmp += 0 ;
break ;
case '3' :
tmp += 1 ;
break ;
case '4' :
tmp += 2 ;
break ;
case '5' :
tmp += 3 ;
break ;
case '6' :
tmp += 4 ;
break ;
case '7' :
tmp += 5 ;
break ;
case '8' :
tmp += 6 ;
break ;
case '9' :
tmp += 7 ;
break ;
case 'T' :
tmp += 8 ;
break ;
case 'J' :
tmp += 9 ;
break ;
case 'Q' :
tmp += 10 ;
break ;
case 'K' :
tmp += 11 ;
break ;
case 'A' :
tmp += 12 ;
break ;
default :
return - 1 ;
}
return tmp ;
}
string guiLog :: convertCardIntToString ( int code )
{
string tmp ;
switch ( code % 13 ) {
case 0 :
tmp = "2" ;
break ;
case 1 :
tmp = "3" ;
break ;
case 2 :
tmp = "4" ;
break ;
case 3 :
tmp = "5" ;
break ;
case 4 :
tmp = "6" ;
break ;
case 5 :
tmp = "7" ;
break ;
case 6 :
tmp = "8" ;
break ;
case 7 :
tmp = "9" ;
break ;
case 8 :
tmp = "T" ;
break ;
case 9 :
tmp = "J" ;
break ;
case 10 :
tmp = "Q" ;
break ;
case 11 :
tmp = "K" ;
break ;
case 12 :
tmp = "A" ;
break ;
default :
return "" ;
}
switch ( code / 13 ) {
case 0 :
tmp += "d" ;
break ;
case 1 :
tmp += "h" ;
break ;
case 2 :
tmp += "s" ;
break ;
case 3 :
tmp += "c" ;
break ;
default :
return "" ;
}
return tmp ;
2011-11-25 21:51:27 +00:00
}