Autoetiquetat del color dels jugadors al HoldemManager (Part 1)
Posted: divendres 20 de maig de 2011 by Porko Jones inSalutacions,
doncs bé... finalment he pogut testejar el sistema i he de dir, modèstia a banda, que els resultats han estat els 100% esperats: a mida que els jugadors van entrant en la classificació que tinc definida, es van catalogant automàticament pel color de la nota al HoldemManager i el HUD m'ho va mostrant en cada refresc.
Al final, donat que tinc més ganes de compartir el sistema que no pas temps com per fer el manual/tutorial que m'agradaria fer, posaré el trigger una mica en "cru", i explicaré una mica com tunnejar un parell de coses, però inicialment, a banda d'això i d'alguna altra cosa que se'm pugui acudir, no posaré rés més. Això sí, quedaré completament a disposició d'explicar qualsevol dubte sobre com instal·lar-lo, etc., per aquells que ho volguéssiu instal·lar, però tot això del que us parlaré us soni una mica a xino... ;)
Anem per feina, doncs. La "criatura" és el codi que vé a continuació. Recordeu, es tracta d'un trigger dissenyat per instal·lar-se directament al servidor PostgreSQL (servidor de base de dades que s'instal·la júntament amb el Holdem Manager). El codi que ve a continuació ja està preparat per, en executar-se com a consulta SQL en el servidor, instal·lar el trigger:
CREATE OR REPLACE FUNCTION check_players_update() RETURNS TRIGGER AS $check_update$
DECLARE
MyColour INTEGER;
BEGIN
SELECT
--O.player_id AS player_id,
case
when (O.Hands > 50) AND (O.VPIP <= 12)
-- NIT (blau marí)
then 1
when (O.Hands > 50) AND (O.VPIP >= 35) AND (O.PFR > 25)
-- MANIAC (lila)
then 2
when (O.Hands > 50) AND (O.VPIP >= 35) AND (O.PFR <= 25)
-- CALLING FISH (verd)
then 3
when (O.Hands > 50) AND (O.VPIP >= 23) AND (O.VPIP <= 25) AND (O.PFR <= 10)
-- CALLING STATION (blau cel)
then 4
when (O.Hands > 100) AND (O.VPIP >= 13) AND (O.VPIP <= 22) AND (O.PFR >= 8) AND (O.PFR <= 20) AND (O."3Bet" <= 3)
-- ABC-Weak reg. (groc)
then 5
when (O.Hands > 100) AND (O.VPIP >= 16) AND (O.VPIP <= 22) AND (O.PFR >= 13) AND (O.PFR <= 20) AND (O."3Bet" >= 4)
-- LAG reg. (taronja)
then 6
when (O.Hands > 100) AND (O.VPIP >= 13) AND (O.VPIP <= 15) AND (O.PFR >= 8) AND (O.PFR <= 12) AND (O."3Bet" >= 4)
-- TAG reg. (vermell)
then 7
else -1
end AS Colour INTO MyColour
FROM (
SELECT
T.player_id AS player_id,
round(case when T.TotalPlayableHands > 0 then T.VPIPHands*100.0/T.TotalPlayableHands else 0 end,0) AS VPIP,
round(case when T.TotalPlayableHands > 0 then T.PFRHands*100.0/T.TotalPlayableHands else 0 end,0) AS PFR,
round(case when T.CouldThreeBet > 0 then T.DidThreeBet*100.0/T.CouldThreeBet else 0 end,0) AS "3Bet",
round(T.NetAmountWon,2) AS NetAmountWon,
T.Hands AS Hands,
T.MaxPlayerTimeStamp as MaxTimeStamp
FROM (
SELECT
sum(case when didvpip = true then 1 else 0 end) as VPIPHands,
sum(case when didpfr = true then 1 else 0 end) as PFRHands,
sum(case when ph.preflopaction_id <> -1 then 1 else 0 end) as TotalPlayableHands,
sum(case when ph.preflopaction_id = 3 or ph.preflopaction_id = 4 then 1 else 0 end) as CouldThreeBet,
sum(case when ph.FirstPreflopActionType_ID = 3 and (ph.preflopaction_id = 3 or ph.preflopaction_id = 4) then 1 else 0 end) as DidThreeBet,
Sum(ph.NetAmountWon)/100.0 as NetAmountWon,
Count(ph.playerhand_id) as Hands,
ph.player_id AS player_id,
MAX(ph.handtimestamp) as MaxPlayerTimeStamp
FROM
public.playerhandscashkeycolumns AS ph
WHERE
ph.player_id = NEW.player_id AND
ph.gametype_id = 1 AND --NL5 FR
ph.handtimestamp >= '1/1/2011'
GROUP BY ph.player_id
HAVING Count(ph.playerhand_id) >= 50
) AS T
) AS O;
IF NOT MyColour IS NULL THEN
LOOP
UPDATE
public.hemplayernotes AS hpn
SET icon_id = COALESCE(MyColour,-1)
WHERE hpn.player_id = NEW.player_id;
IF found THEN
RETURN NULL;
END IF;
BEGIN
INSERT INTO
public.hemplayernotes(player_id,note,icon_id)
VALUES (NEW.player_id, E'', COALESCE(MyColour,-1));
RETURN NULL; -- result is ignored since this is an AFTER trigger
EXCEPTION WHEN unique_violation THEN
-- do nothing, and loop to try the UPDATE again
END;
END LOOP;
END IF;
RETURN NULL;
END;
$check_update$ LANGUAGE plpgsql;
DROP TRIGGER IF EXISTS check_update ON public.players;
CREATE TRIGGER check_update
AFTER INSERT OR UPDATE ON public.players
FOR EACH ROW
EXECUTE PROCEDURE check_players_update();
Toooooma tralla!!! :D
Coses importants a tenir en compte:
- En primer lloc, disculpes perquè, per molt que ho he intentat, el blog no em respecta les tabulacions de sagnat i el codi es fa una mica ininteligible sense aquest sagnat. Procuraré pujar el fitxer .SQL amb el codi per tal de que el pogueu utilitzar amb més facilitat.
EDITAT: El podeu baixar aquí ... http://www.megaupload.com/?d=7358NYW5
- En segon lloc, hi ha una secció marcada en taronja. Aquesta és la secció on defineixo cada categoria i el codi de color que li associo (dels colors definits al Holdem Manager). Les categories les he rumiat barrejant conceptes llegits aquí i allà, i diria que, com a classificació a l'engròs d'un jugador, està prou bé (al menys per microlímits, on les línies generals contra un tipus de jugador concret poden ser les mateixes sense problema). Sou lliures de probar les vostres pròpies i/o suggerir-ne de noves o diferents.
- Finalment, en tercer lloc, hi ha una part de codi marcada en vermell. Aquesta part potser cal configurar-la, o ampliar-la, segons el cas. Es tracta de:
ph.gametype_id = 1 AND --NL5 FR
ph.handtimestamp >= '1/1/2011'
GROUP BY ph.player_id
HAVING Count(ph.playerhand_id) >= 50
*** La primera línia indica per a quin tipus de joc estem classificant les mans dels jugadors. Així doncs, el gametype_id ha de ser el número que identifica el nivell dessitjat, segons el que tinguem a la taula GAMETYPES del Holdem Manager. En el meu cas, el identificador per a NL5 és el 1. Fixeu-vos que aquí no hi ha control sobre si es tracta de FullRing o 6Max, i jo no necessito fer aquesta mena de distinció. En cas que es necessités, caldría afegir alguna altra condició (hauria de mirar quina) per filtrar entre les mans de 6 jugadors i les de 7 o més.
*** La segona línia indica la data a partir de la qual volem començar a considerar les mans sobre les que es calculen els VPIP, PFR, etc.
*** I la última línia indica a partir de quantes mans volem processar els resultats obtinguts. Si us fixeu, en la secció de classificació de tipus de jugadors sempre miro que Hands sigui major que 50 o major que 100. Si volgués definir-ne alguna tenint en compte, per exemple, només 30 mans, aleshores caldria canviar aquest valor també per 30, o sinó no tindriem dades per processar fins que els jugadors no tinguéssin 50 mans. En cas contrari (que volguem augmentar el nombre de mans a tenir en compte en la definició de tipus de jugadors) també podríem augmentar aquest número per tal d'optimitzar el rendiment una mica.
Val a dir que, al menys en el meu cas, la consulta no sobrecarrega el servidor de bases de dades (com si no hi fos).
En el meu cas no m'ha fet falta afegir controls sobre de quina sala han de ser les mans o els jugadors (jo només jugo cash a PS), però igualment crec que la gràcia és que funcioni per a mans agafades de tot arreu. Si algú necessita modificacions en aquest sentit, també puc mirar què es pot fer.
En la propera fase, la idea és que aquest codi de colors es pugui exportar cap a les notes de PokerStars de forma més o menys periòdica, i poder fer així una mica de selecció de taula veient directament els colors dels malandrins en el lobby de la sala.
Apa doncs, espero que el codi us serveixi, tot i no estar correctament sagnat (mentre no pujo el .SQL). Jom ja he dit, si hi ha rés a comentar, estic completament obert a suggeriments! ;)