card_hand=3
players_n=3
tables_n=44
-tables_auth_n=12
+tables_appr_n=12
+tables_auth_n=8
tables_cert_n=4
brisk_auth_conf="brisk_spu_auth.conf.pho"
brisk_debug="0x0400"
echo "$1 -h"
echo "$1 chk - run lintian on all ph* files."
echo "$1 pkg - build brisk packages."
- echo "$1 [-W] [-n 3|5] [-c 2|8] [-t <(n>=4)>] [-T <auth_tab>] [-G <cert_tab>] [-A <apache-conf>] [-a <auth_file_name>] [-f <conffile>] [-p <outconf>] [-U <usock_path>] [-u <sys_user>] [-d <TRUE|FALSE>] [-w <web_dir>] [-k <ftok_dir>] [-l <legal_path>] [-y <proxy_path>] [-P <prefix_path>] [-x]"
+ echo "$1 [-W] [-n 3|5] [-c 2|8] [-t <(n>=4)>] [-T <auth_tab>] [-r <appr_tab>] [-G <cert_tab>] [-A <apache-conf>] [-a <auth_file_name>] [-f <conffile>] [-p <outconf>] [-U <usock_path>] [-u <sys_user>] [-d <TRUE|FALSE>] [-w <web_dir>] [-k <ftok_dir>] [-l <legal_path>] [-y <proxy_path>] [-P <prefix_path>] [-x]"
echo " -h this help"
echo " -f use this config file"
echo " -p save preferences in the file"
echo " -c number cards in hand - def. $card_hand"
echo " -n number of players - def. $players_n"
echo " -t number of tables - def. $tables_n"
+ echo " -r number of appr-only tables - def. $tables_appr_n"
echo " -T number of auth-only tables - def. $tables_auth_n"
echo " -G number of cert-only tables - def. $tables_cert_n"
echo " -a authorization file name - def. \"$brisk_auth_conf\""
-c*) card_hand="$(get_param "-c" "$1" "$2")"; sh=$?;;
-n*) players_n="$(get_param "-n" "$1" "$2")"; sh=$?;;
-t*) tables_n="$(get_param "-t" "$1" "$2")"; sh=$?;;
+ -r*) tables_appr_n="$(get_param "-r" "$1" "$2")"; sh=$?;;
-T*) tables_auth_n="$(get_param "-T" "$1" "$2")"; sh=$?;;
-G*) tables_cert_n="$(get_param "-G" "$1" "$2")"; sh=$?;;
-a*) brisk_auth_conf="$(get_param "-a" "$1" "$2")"; sh=$?;;
echo " card_hand: $card_hand"
echo " players_n: $players_n"
echo " tables_n: $tables_n"
+echo " tables_appr_n: $tables_appr_n"
echo " tables_auth_n: $tables_auth_n"
echo " tables_cert_n: $tables_cert_n"
echo " brisk_auth_conf: \"$brisk_auth_conf\""
echo "card_hand=$card_hand"
echo "players_n=$players_n"
echo "tables_n=$tables_n"
+ echo "tables_appr_n=$tables_appr_n"
echo "tables_auth_n=$tables_auth_n"
echo "tables_cert_n=$tables_cert_n"
echo "brisk_auth_conf=\"$brisk_auth_conf\""
sed -i "s@define *( *'USOCK_PATH',[^)]*)@define('USOCK_PATH', \"$usock_path\")@g" ${web_path}__/spush/brisk-spush.phh
sed -i "s@define *( *'TABLES_N',[^)]*)@define('TABLES_N', $tables_n)@g;
+s@define *( *'TABLES_APPR_N',[^)]*)@define('TABLES_APPR_N', $tables_appr_n)@g;
s@define *( *'TABLES_AUTH_N',[^)]*)@define('TABLES_AUTH_N', $tables_auth_n)@g;
s@define *( *'TABLES_CERT_N',[^)]*)@define('TABLES_CERT_N', $tables_cert_n)@g;
s@define *( *'BRISK_DEBUG',[^)]*)@define('BRISK_DEBUG', $brisk_debug)@g;
TODO |
------+
+ BUGS |
+ ------+
+ DONE - Not sequence of 3 same chars
+ DONE . check server side with test
+ DONE - Global vars checker
+ <release>
+ - usermgmt: add user delete
+ DONE - 10002 message when already clicked
+ DONE - trim spaces in apprentice form
+ DONE - Remove books from chat
+ DONE - usermgmt: add email
+
+
FEATURES |
----------+
- - Global vars checker
+ WIP * inherited info
+ * Users Network construction
+ DONE - sql
+ DONE - dbase API
+ DONE - add apprentices tables
+ DONE - remove entry when set unknown
+ DONE - enhance info interface
+ DONE . SQL to show current evaluation
+ DONE . disable parts of interface
+ WIP . add title to items
+ . fix SELECT
+ <release>
+ - minisplash at end of the match
+ - differentiate table authorization
+ * add new kind of isolation for apprentice
+
+ * Double click on chat to open preferences
+
+ * APPRENTICE
+ Phase2
+ DONE - match counters (part 2)
+ DONE . migration script for old users
+ - guarantee for apprentice
+
+
+
+---------
+ - APPRENTICE
+ Phase2
+ DONE - match counters (part 2)
+ DONE . migration script for old users
+
- APPRENTICE
Phase1
DONE - correggere minuta giornaliera
DONE - fix layout of tables
DONE - aggiungere books.png
- Phase2
- - match counters (part 2)
- . migration script for old users
- - guarantee for apprentice
-
- MENTORS
- listen all
--- /dev/null
+#!/bin/bash
+glob="$(grep '$G_' $(find -type f -name '*.ph*') | sed 's/\$G_/\n\$G_/g' | grep '^\$G_' | sed 's/[^\$a-zA-Z0-9_].*//g' | sort | uniq | sed 's/\$//g' )"
+
+li=""
+for i in $glob ; do
+ if [ $(echo "${li}, '$i'," | wc -c) -gt 80 ]; then
+ echo $li
+ li=""
+ fi
+ if [ "$li" = "" ]; then
+ li="'${i}', "
+ else
+ li="${li} '${i}',"
+ fi
+done
+
+
===== Sparse documentation about Brisk. =====
+==== Form Workflow ====
+
+- div on page
+
+
User cleanup:
spush::garbage_manager()
if (user->the_end)
if [ "$1" ]; then
echo "$1"
elif [ "$TYPE_FILES" = "a" ]; then
- echo sql.d/[0-9]*
+ find sql.d/ -name '[0-9]*' -type f | sort -n | tr '\n' ' '
elif [ "$TYPE_FILES" = "d" ]; then
- echo sql.d/[0-9]*.{sql,devel}
+ find sql.d/ -name '[0-9]*' | egrep '.*_devel.sql$|^[^_]+.sql$' | sort -n | tr '\n' ' '
else
- echo sql.d/[0-9]*.sql
- fi); do
+ find sql.d/ -name '[0-9]*' | egrep '^[^_]+.sql$' | sort -n | tr '\n' ' '
+ fi); do
echo "-- FILE BEG: $fil"
cat "$fil"
echo "-- FILE END: $fil"
+++ /dev/null
-DELETE FROM #PFX#bin5_matches WHERE code = 100 OR code = 101;
-
-INSERT INTO #PFX#bin5_matches (code, ttok, tidx, mazzo_next, mult_next) VALUES (100, 'normalize_points', 2, 1, 1) RETURNING *;
-INSERT INTO #PFX#bin5_table_orders (mcode, ucode, pos) VALUES (100, 10101, 0);
-INSERT INTO #PFX#bin5_table_orders (mcode, ucode, pos) VALUES (100, 10102, 1);
-INSERT INTO #PFX#bin5_table_orders (mcode, ucode, pos) VALUES (100, 10103, 2);
-INSERT INTO #PFX#bin5_games (code, mcode, tstamp, act, asta_pnt, pnt, asta_win, friend, mazzo, mult)
- VALUES (200, 100, to_timestamp(#NOW# - 1000), 2, 60, 0, -1, -1, 0, 0) RETURNING *;
-INSERT INTO #PFX#bin5_points (gcode, ucode, pts) VALUES (200, 10101, 0);
-INSERT INTO #PFX#bin5_points (gcode, ucode, pts) VALUES (200, 10102, 0);
-INSERT INTO #PFX#bin5_points (gcode, ucode, pts) VALUES (200, 10103, 0);
-UPDATE #PFX#bin5_matches SET (mazzo_next, mult_next) = (2, 0) WHERE code = 100;
-INSERT INTO #PFX#bin5_games (code, mcode, tstamp, act, asta_pnt, pnt, asta_win, friend, mazzo, mult)
- VALUES (201, 100, to_timestamp(#NOW# - 900), 0, 61, 37, 2, 1, 1, 1) RETURNING *;
-INSERT INTO #PFX#bin5_points (gcode, ucode, pts) VALUES (201, 10101, 2);
-INSERT INTO #PFX#bin5_points (gcode, ucode, pts) VALUES (201, 10102, -2);
-INSERT INTO #PFX#bin5_points (gcode, ucode, pts) VALUES (201, 10103, -4);
-
-
-INSERT INTO #PFX#bin5_matches (code, ttok, tidx, mazzo_next, mult_next) VALUES (101, 'normalize_points2', 2, 1, 0) RETURNING *;
-INSERT INTO #PFX#bin5_table_orders (mcode, ucode, pos) VALUES (101, 10101, 0);
-INSERT INTO #PFX#bin5_table_orders (mcode, ucode, pos) VALUES (101, 10102, 1);
-INSERT INTO #PFX#bin5_table_orders (mcode, ucode, pos) VALUES (101, 10103, 2);
-INSERT INTO #PFX#bin5_games (code, mcode, tstamp, act, asta_pnt, pnt, asta_win, friend, mazzo, mult)
- VALUES (202, 101, to_timestamp(#NOW# - 800), 2, 60, 0, -1, -1, 0, 0) RETURNING *;
-INSERT INTO #PFX#bin5_points (gcode, ucode, pts) VALUES (202, 10101, 0);
-INSERT INTO #PFX#bin5_points (gcode, ucode, pts) VALUES (202, 10102, 0);
-INSERT INTO #PFX#bin5_points (gcode, ucode, pts) VALUES (202, 10103, 0);
-UPDATE #PFX#bin5_matches SET (mazzo_next, mult_next) = (2, 0) WHERE code = 100;
-INSERT INTO #PFX#bin5_games (code, mcode, tstamp, act, asta_pnt, pnt, asta_win, friend, mazzo, mult)
- VALUES (203, 101, to_timestamp(#NOW# - 700), 0, 81, 37, 2, 1, 1, 1) RETURNING *;
-INSERT INTO #PFX#bin5_points (gcode, ucode, pts) VALUES (203, 10101, 6);
-INSERT INTO #PFX#bin5_points (gcode, ucode, pts) VALUES (203, 10102, -6);
-INSERT INTO #PFX#bin5_points (gcode, ucode, pts) VALUES (203, 10103, -12);
-
-
-
--- /dev/null
+DELETE FROM #PFX#bin5_matches WHERE code = 100 OR code = 101;
+
+INSERT INTO #PFX#bin5_matches (code, ttok, tidx, mazzo_next, mult_next) VALUES (100, 'normalize_points', 2, 1, 1) RETURNING *;
+INSERT INTO #PFX#bin5_table_orders (mcode, ucode, pos) VALUES (100, 10101, 0);
+INSERT INTO #PFX#bin5_table_orders (mcode, ucode, pos) VALUES (100, 10102, 1);
+INSERT INTO #PFX#bin5_table_orders (mcode, ucode, pos) VALUES (100, 10103, 2);
+INSERT INTO #PFX#bin5_games (code, mcode, tstamp, act, asta_pnt, pnt, asta_win, friend, mazzo, mult)
+ VALUES (200, 100, to_timestamp(#NOW# - 1000), 2, 60, 0, -1, -1, 0, 0) RETURNING *;
+INSERT INTO #PFX#bin5_points (gcode, ucode, pts) VALUES (200, 10101, 0);
+INSERT INTO #PFX#bin5_points (gcode, ucode, pts) VALUES (200, 10102, 0);
+INSERT INTO #PFX#bin5_points (gcode, ucode, pts) VALUES (200, 10103, 0);
+UPDATE #PFX#bin5_matches SET (mazzo_next, mult_next) = (2, 0) WHERE code = 100;
+INSERT INTO #PFX#bin5_games (code, mcode, tstamp, act, asta_pnt, pnt, asta_win, friend, mazzo, mult)
+ VALUES (201, 100, to_timestamp(#NOW# - 900), 0, 61, 37, 2, 1, 1, 1) RETURNING *;
+INSERT INTO #PFX#bin5_points (gcode, ucode, pts) VALUES (201, 10101, 2);
+INSERT INTO #PFX#bin5_points (gcode, ucode, pts) VALUES (201, 10102, -2);
+INSERT INTO #PFX#bin5_points (gcode, ucode, pts) VALUES (201, 10103, -4);
+
+
+INSERT INTO #PFX#bin5_matches (code, ttok, tidx, mazzo_next, mult_next) VALUES (101, 'normalize_points2', 2, 1, 0) RETURNING *;
+INSERT INTO #PFX#bin5_table_orders (mcode, ucode, pos) VALUES (101, 10101, 0);
+INSERT INTO #PFX#bin5_table_orders (mcode, ucode, pos) VALUES (101, 10102, 1);
+INSERT INTO #PFX#bin5_table_orders (mcode, ucode, pos) VALUES (101, 10103, 2);
+INSERT INTO #PFX#bin5_games (code, mcode, tstamp, act, asta_pnt, pnt, asta_win, friend, mazzo, mult)
+ VALUES (202, 101, to_timestamp(#NOW# - 800), 2, 60, 0, -1, -1, 0, 0) RETURNING *;
+INSERT INTO #PFX#bin5_points (gcode, ucode, pts) VALUES (202, 10101, 0);
+INSERT INTO #PFX#bin5_points (gcode, ucode, pts) VALUES (202, 10102, 0);
+INSERT INTO #PFX#bin5_points (gcode, ucode, pts) VALUES (202, 10103, 0);
+UPDATE #PFX#bin5_matches SET (mazzo_next, mult_next) = (2, 0) WHERE code = 100;
+INSERT INTO #PFX#bin5_games (code, mcode, tstamp, act, asta_pnt, pnt, asta_win, friend, mazzo, mult)
+ VALUES (203, 101, to_timestamp(#NOW# - 700), 0, 81, 37, 2, 1, 1, 1) RETURNING *;
+INSERT INTO #PFX#bin5_points (gcode, ucode, pts) VALUES (203, 10101, 6);
+INSERT INTO #PFX#bin5_points (gcode, ucode, pts) VALUES (203, 10102, -6);
+INSERT INTO #PFX#bin5_points (gcode, ucode, pts) VALUES (203, 10103, -12);
+
+
+
--- /dev/null
+--
+-- Table to manage users trust network
+--
+DROP TABLE IF EXISTS #PFX#usersnet;
+CREATE TABLE #PFX#usersnet (
+ owner integer REFERENCES #PFX#users (code)
+ ON DELETE cascade ON UPDATE cascade, -- network owner
+ target integer REFERENCES #PFX#users (code)
+ ON DELETE cascade ON UPDATE cascade, -- evaluated user
+ friend integer, -- friendship level
+ -- 1"black", 2"unknown", 3"test", 4"friend", 5"bff"
+ skill float, -- skill level
+ trust float, -- auth
+ ctime timestamp DEFAULT now(), -- creation time
+ mtime timestamp DEFAULT to_timestamp(0) -- modification time
+ );
+
+DROP INDEX IF EXISTS #PFX#usersnet_owner_idx;
+DROP INDEX IF EXISTS #PFX#usersnet_target_idx;
+DROP INDEX IF EXISTS #PFX#usersnet_owner_target_idx;
+
+CREATE INDEX #PFX#usersnet_owner_idx ON #PFX#usersnet (owner);
+CREATE INDEX #PFX#usersnet_target_idx ON #PFX#usersnet (target);
+CREATE UNIQUE INDEX #PFX#usersnet_owner_target_idx ON #PFX#usersnet (owner, target);
+
+DROP VIEW #PFX#usersnet_widefriend;
+CREATE VIEW #PFX#usersnet_widefriend
+ AS SELECT un.owner, ur.target, ur.friend, count(*) as count
+ FROM #PFX#usersnet AS un, #PFX#usersnet AS ur
+ WHERE un.target = ur.owner AND un.friend >= 4 -- 'un' is, at least, our friend
+ GROUP BY un.owner, ur.target, ur.friend;
+
+DROP VIEW #PFX#usersnet_narrowfriend;
+CREATE VIEW #PFX#usersnet_narrowfriend
+ AS SELECT un.owner, ur.target, ur.friend, count(*) as count
+ FROM #PFX#usersnet AS un, #PFX#usersnet AS ur
+ WHERE un.target = ur.owner AND un.friend >= 5 -- 'un' is, at least, our friend
+ GROUP BY un.owner, ur.target, ur.friend;
+
+DROP VIEW #PFX#usersnet_wideskill;
+CREATE VIEW #PFX#usersnet_wideskill
+ AS SELECT un.owner, ur.target, SUM(ur.skill * un.trust) / SUM(un.trust) as skill, count(*) as count
+ FROM #PFX#usersnet AS un, #PFX#usersnet AS ur
+ WHERE un.target = ur.owner AND un.friend >= 4 -- 'un' is, at least, our friend
+ AND ur.friend > 2
+ GROUP BY un.owner, ur.target;
+
+DROP VIEW #PFX#usersnet_narrowskill;
+CREATE VIEW #PFX#usersnet_narrowskill
+ AS SELECT
+ un.owner AS owner
+ , ur.target AS target
+ , SUM(ur.skill * un.trust) / SUM(un.trust) AS skill
+ , COUNT(*) AS count
+ FROM #PFX#usersnet AS un, #PFX#usersnet as ur
+ WHERE un.target = ur.owner AND un.friend = 5 -- 'ur' owner must be bbf of un.owner
+ AND ur.friend > 2
+ GROUP BY un.owner, ur.target;
+
+DROP VIEW #PFX#usersnet_narrowblack;
+CREATE VIEW #PFX#usersnet_narrowblack
+ AS SELECT DISTINCT un.owner AS owner, ur.target AS target, 1 AS black_cnt
+ FROM #PFX#usersnet AS un, #PFX#usersnet as ur
+ WHERE un.target = ur.owner
+ AND un.friend = 5 -- ur owner must be bbf of un.owner
+ AND ur.friend = 1; -- ur must be blacked
+
+DROP VIEW #PFX#usersnet_party;
+CREATE VIEW #PFX#usersnet_party
+ AS (SELECT ns.*, nb.black_cnt FROM #PFX#usersnet_narrowskill AS ns
+ LEFT JOIN #PFX#usersnet_narrowblack AS nb
+ USING (owner, target)
+ -- all except targets managed directly by the owner
+ WHERE black_cnt is null
+ AND target NOT IN (SELECT target FROM #PFX#usersnet AS du WHERE du.owner = ns.owner)
+ UNION ALL
+ (SELECT owner, target, skill, 1 AS count, null AS black_cnt
+ FROM #PFX#usersnet
+ WHERE friend > 2))
+ ORDER BY target;
+++ /dev/null
---
--- Populate users db.
---
-
--- macro for user_flag bit-field
--- define('USER_FLAG_TY_ALL', 0xff0000); // done
--- define('USER_FLAG_TY_NORM', 0x010000); // done
--- define('USER_FLAG_TY_SUPER', 0x020000); // done
--- define('USER_FLAG_TY_CERT', 0x040000); // done
--- define('USER_FLAG_TY_FIRONLY', 0x200000); // done
--- define('USER_FLAG_TY_ADMIN', 0x400000); // done
--- define('USER_FLAG_TY_DISABLE', 0x800000); // done
-
-
-DELETE FROM #PFX#users WHERE code = 10101;
-DELETE FROM #PFX#users WHERE guar_code = 10101 AND code != 10101;
-INSERT INTO #PFX#users (code, login, pass, email, type, guar_code) VALUES (10101, 'uno', md5('one'), 'uno@pluto.com', CAST (X'00450000' as integer), 10101);
-DELETE FROM #PFX#users WHERE code = 10102;
-INSERT INTO #PFX#users (code, login, pass, email, type, guar_code) VALUES (10102, 'due', md5('two'), 'due@pluto.com', CAST (X'00010000' as integer), 10101);
-DELETE FROM #PFX#users WHERE code = 10103;
-INSERT INTO #PFX#users (code, login, pass, email, type, guar_code) VALUES (10103, 'tre', md5('thr'), 'tre@pluto.com', CAST (X'00010000' as integer), 10102);
-DELETE FROM #PFX#users WHERE code = 10104;
-INSERT INTO #PFX#users (code, login, pass, email, type, guar_code) VALUES (10104, 'qua', md5('for'), 'qua@pluto.com', CAST (X'00010000' as integer), 10102);
-DELETE FROM #PFX#users WHERE code = 10105;
-INSERT INTO #PFX#users (code, login, pass, email, type, guar_code) VALUES (10105, 'cin', md5('fiv'), 'cin@pluto.com', CAST (X'00010000' as integer), 10103);
-DELETE FROM #PFX#users WHERE code = 10106;
-INSERT INTO #PFX#users (code, login, pass, email, type, guar_code) VALUES (10106, 'sei', md5('six'), 'sei@pluto.com', CAST (X'00210000' as integer), 10103);
-ALTER SEQUENCE #PFX#users_code_seq RESTART WITH 10107;
--- /dev/null
+--
+-- Populate users db.
+--
+
+-- macro for user_flag bit-field
+-- define('USER_FLAG_TY_ALL', 0xff0000); // done
+-- define('USER_FLAG_TY_NORM', 0x010000); // done
+-- define('USER_FLAG_TY_SUPER', 0x020000); // done
+-- define('USER_FLAG_TY_CERT', 0x040000); // done
+-- define('USER_FLAG_TY_APPR', 0x080000); // done
+-- define('USER_FLAG_TY_FIRONLY', 0x200000); // done
+-- define('USER_FLAG_TY_ADMIN', 0x400000); // done
+-- define('USER_FLAG_TY_DISABLE', 0x800000); // done
+
+
+DELETE FROM #PFX#users WHERE code = 10101;
+DELETE FROM #PFX#users WHERE guar_code = 10101 AND code != 10101;
+INSERT INTO #PFX#users (code, login, pass, email, type, guar_code) VALUES (10101, 'uno', md5('one'), 'uno@pluto.com', CAST (X'00450000' as integer), 10101);
+DELETE FROM #PFX#users WHERE code = 10102;
+INSERT INTO #PFX#users (code, login, pass, email, type, guar_code) VALUES (10102, 'due', md5('two'), 'due@pluto.com', CAST (X'00010000' as integer), 10101);
+DELETE FROM #PFX#users WHERE code = 10103;
+INSERT INTO #PFX#users (code, login, pass, email, type, guar_code) VALUES (10103, 'tre', md5('thr'), 'tre@pluto.com', CAST (X'00030000' as integer), 10102);
+DELETE FROM #PFX#users WHERE code = 10104;
+INSERT INTO #PFX#users (code, login, pass, email, type, guar_code) VALUES (10104, 'qua', md5('for'), 'qua@pluto.com', CAST (X'00010000' as integer), 10102);
+DELETE FROM #PFX#users WHERE code = 10105;
+INSERT INTO #PFX#users (code, login, pass, email, type, guar_code) VALUES (10105, 'cin', md5('fiv'), 'cin@pluto.com', CAST (X'00010000' as integer), 10103);
+DELETE FROM #PFX#users WHERE code = 10106;
+INSERT INTO #PFX#users (code, login, pass, email, type, guar_code) VALUES (10106, 'sei', md5('six'), 'sei@pluto.com', CAST (X'00210000' as integer), 10103);
+DELETE FROM #PFX#users WHERE code = 10107;
+INSERT INTO #PFX#users (code, login, pass, email, type, guar_code) VALUES (10107, E'"/\\''|', md5('sev'), 'sev@pluto.com', CAST (X'00210000' as integer), 10103);
+DELETE FROM #PFX#users WHERE code = 10108;
+INSERT INTO #PFX#users (code, login, pass, email, type, guar_code) VALUES (10108, E'appr', md5('appr'), 'appr@pluto.com', CAST (X'00080000' as integer), 10103);
+
+DELETE FROM #PFX#users WHERE code = 10109;
+INSERT INTO #PFX#users (code, login, pass, email, type, guar_code) VALUES (10109, 'bosi', md5('bosi'), 'bosi@pluto.com', CAST (X'00010000' as integer), 10103);
+DELETE FROM #PFX#users WHERE code = 10110;
+INSERT INTO #PFX#users (code, login, pass, email, type, guar_code) VALUES (10110, 'bono', md5('bono'), 'bono@pluto.com', CAST (X'00010000' as integer), 10103);
+DELETE FROM #PFX#users WHERE code = 10111;
+INSERT INTO #PFX#users (code, login, pass, email, type, guar_code) VALUES (10111, 'nosi', md5('nosi'), 'nosi@pluto.com', CAST (X'00010000' as integer), 10103);
+DELETE FROM #PFX#users WHERE code = 10112;
+INSERT INTO #PFX#users (code, login, pass, email, type, guar_code) VALUES (10112, 'sino', md5('sino'), 'sino@pluto.com', CAST (X'00010000' as integer), 10103);
+DELETE FROM #PFX#users WHERE code = 10113;
+INSERT INTO #PFX#users (code, login, pass, email, type, guar_code) VALUES (10113, 'doub', md5('boub'), 'doub@pluto.com', CAST (X'00010000' as integer), 10103);
+DELETE FROM #PFX#users WHERE code = 10114;
+INSERT INTO #PFX#users (code, login, pass, email, type, guar_code) VALUES (10114, 'selfguar', md5('self'), 'self@pluto.com', CAST (X'00010000' as integer), 10103);
+DELETE FROM #PFX#users WHERE code = 10115;
+INSERT INTO #PFX#users (code, login, pass, email, type, guar_code) VALUES (10115, 'bonoonly', md5('bonoonly'), 'bonoonly@pluto.com', CAST (X'00010000' as integer), 10101);
+
+ALTER SEQUENCE #PFX#users_code_seq RESTART WITH 10116;
--- /dev/null
+-- primary owner 10101
+DELETE FROM #PFX#usersnet WHERE owner = 10101 AND target = 10102;
+INSERT INTO #PFX#usersnet (owner, target, friend, skill, trust) VALUES (10101, 10102, 4, 2, 5);
+DELETE FROM #PFX#usersnet WHERE owner = 10101 AND target = 10103;
+INSERT INTO #PFX#usersnet (owner, target, friend, skill, trust) VALUES (10101, 10103, 5, 2, 3);
+-- doub
+DELETE FROM #PFX#usersnet WHERE owner = 10101 AND target = 10113;
+INSERT INTO #PFX#usersnet (owner, target, friend, skill, trust) VALUES (10101, 10113, 5, 2, 5);
+
+-- primary owner: discarded target
+DELETE FROM #PFX#usersnet WHERE owner = 10101 AND target = 10104;
+INSERT INTO #PFX#usersnet (owner, target, friend, skill, trust) VALUES (10101, 10104, 1, 2, 5);
+
+-- secondary owners for 10101
+DELETE FROM #PFX#usersnet WHERE owner = 10102 AND target = 10105;
+INSERT INTO #PFX#usersnet (owner, target, friend, skill, trust) VALUES (10102, 10105, 4, 2, 3);
+DELETE FROM #PFX#usersnet WHERE owner = 10103 AND target = 10105;
+INSERT INTO #PFX#usersnet (owner, target, friend, skill, trust) VALUES (10103, 10105, 4, 3, 4);
+DELETE FROM #PFX#usersnet WHERE owner = 10104 AND target = 10105;
+INSERT INTO #PFX#usersnet (owner, target, friend, skill, trust) VALUES (10104, 10105, 4, 5, 4);
+DELETE FROM #PFX#usersnet WHERE owner = 10113 AND target = 10105;
+INSERT INTO #PFX#usersnet (owner, target, friend, skill, trust) VALUES (10113, 10105, 4, 2, 5);
+
+DELETE FROM #PFX#usersnet WHERE owner = 10101 AND target = 10107;
+INSERT INTO #PFX#usersnet (owner, target, friend, skill, trust) VALUES (10101, 10107, 3, 3, 4);
+
+-- check sit permission
+-- bosi
+DELETE FROM #PFX#usersnet WHERE owner = 10102 AND target = 10109;
+INSERT INTO #PFX#usersnet (owner, target, friend, skill, trust) VALUES (10102, 10109, 4, 2, 3);
+DELETE FROM #PFX#usersnet WHERE owner = 10103 AND target = 10109;
+INSERT INTO #PFX#usersnet (owner, target, friend, skill, trust) VALUES (10103, 10109, 4, 2, 3);
+
+-- bono
+DELETE FROM #PFX#usersnet WHERE owner = 10102 AND target = 10110;
+INSERT INTO #PFX#usersnet (owner, target, friend, skill, trust) VALUES (10102, 10110, 4, 2, 3);
+DELETE FROM #PFX#usersnet WHERE owner = 10103 AND target = 10110;
+INSERT INTO #PFX#usersnet (owner, target, friend, skill, trust) VALUES (10103, 10110, 1, 2, 3);
+
+-- nosi
+DELETE FROM #PFX#usersnet WHERE owner = 10101 AND target = 10111;
+INSERT INTO #PFX#usersnet (owner, target, friend, skill, trust) VALUES (10101, 10111, 1, 2, 3);
+DELETE FROM #PFX#usersnet WHERE owner = 10102 AND target = 10111;
+INSERT INTO #PFX#usersnet (owner, target, friend, skill, trust) VALUES (10102, 10111, 4, 2, 3);
+DELETE FROM #PFX#usersnet WHERE owner = 10103 AND target = 10111;
+INSERT INTO #PFX#usersnet (owner, target, friend, skill, trust) VALUES (10103, 10111, 4, 2, 3);
+
+-- sino
+DELETE FROM #PFX#usersnet WHERE owner = 10101 AND target = 10112;
+INSERT INTO #PFX#usersnet (owner, target, friend, skill, trust) VALUES (10101, 10112, 4, 2, 3);
+DELETE FROM #PFX#usersnet WHERE owner = 10102 AND target = 10112;
+INSERT INTO #PFX#usersnet (owner, target, friend, skill, trust) VALUES (10102, 10112, 4, 2, 3);
+DELETE FROM #PFX#usersnet WHERE owner = 10103 AND target = 10112;
+INSERT INTO #PFX#usersnet (owner, target, friend, skill, trust) VALUES (10103, 10112, 1, 2, 3);
+
+-- bonoonly
+DELETE FROM #PFX#usersnet WHERE owner = 10103 AND target = 10115;
+INSERT INTO #PFX#usersnet (owner, target, friend, skill, trust) VALUES (10103, 10115, 1, 0, 0);
+
+SELECT * FROM #PFX#usersnet WHERE owner = 10101 OR owner IN (10102, 10103, 10113) ORDER BY target;
+
+SELECT * FROM #PFX#usersnet_wideskill ORDER BY owner, target;
+
+SELECT * FROM #PFX#usersnet_narrowskill ORDER BY owner, target;
+
+SELECT owner, target, skill, 1 AS count, us.login as login FROM #PFX#usersnet, #PFX#users as us WHERE owner = 10101 AND us.code = target AND friend > 2 ORDER BY target;
+
+SELECT ns.*, us.login AS login FROM #PFX#usersnet_narrowskill as ns, #PFX#users AS us WHERE owner = 10101
+ AND ns.target NOT IN (SELECT target FROM #PFX#usersnet WHERE owner = 10101)
+AND us.code = ns.target UNION SELECT owner, target, skill, 1 AS count
+-- , 0 AS black
+, us.login as login FROM #PFX#usersnet, #PFX#users as us WHERE owner = 10101 AND us.code = target AND friend > 2 ORDER BY target;
+
+SELECT us.login, pa.* FROM #PFX#usersnet_party pa, #PFX#users as us WHERE pa.target = us.code AND pa.owner = 10101;
+
+SELECT * FROM #PFX#usersnet_widefriend ORDER BY owner, target, friend;
+SELECT * FROM #PFX#usersnet_narrowfriend ORDER BY owner, target, friend;
--- /dev/null
+#!/usr/bin/php
+<?php
+
+$G_base = "web/";
+
+require_once('test/Obj/test.phh');
+require_once('web/Obj/brisk.phh');
+
+printf("testing internal_encoding: ");
+if (mb_internal_encoding() != "UTF-8") {
+ printf("mb_internal_encoding from cli/php.ini: [%s], FIX with UTF-8\n", mb_internal_encoding());
+ exit(1);
+}
+else {
+ printf("UTF-8, OK\n");
+}
+
+$nam = array ("ò12345678912", "ò123456789123", "pippo", "pìppo", "zorrro", "pìììppo");
+
+if (mb_strlen($nam[0]) != 12) {
+ printf("mb_strlen not return expected len (12) but %d\n", mb_strlen($nam[0]));
+ exit(1);
+}
+
+for ($i = 0 ; $i < count($nam) ; $i++) {
+ printf("[%s] %s\n", $nam[$i], (login_consistency($nam[$i]) ? "TRUE" : "FALSE"));
+}
+
+?>
\ No newline at end of file
// 26 hours between 2 successive registration from this area
$G_selfreg_mask = 0xfffff000;
$G_selfreg_tout = 93600;
+$G_notguar_code = 10114;
// G_dbasetype value can be "pgsql" or "file"
$G_dbasetype="pgsql";
define('LEGAL_PATH', "/tmp/legal_brisk");
define('PROXY_PATH', "/var/lib/brisk_proxy");
define('TABLES_N', 36);
+define('TABLES_APPR_N', 12);
define('TABLES_AUTH_N', 8);
define('TABLES_CERT_N', 4);
define('PLAYERS_N', 3);
$G_lng = langtolng($G_lang);
$G_all_points = array( 11,10,4,3,2, 0,0,0,0,0 );
-$G_brisk_version = "5.1.3";
+$G_brisk_version = "5.2.1";
/* MLANG: ALL THE INFO STRINGS IN brisk.phh */
-$root_wellarr = array( 'it' => array ( 'Brisk (Ver. '.$G_brisk_version.'), <b>NOVITA\'</b>: comando /info e doppio click sugli utenti registrati, nuovi utenti apprendisti, info su numero di mani e di partite.',
+$root_wellarr = array( 'it' => array ( 'Brisk (Ver. '.$G_brisk_version.'), <b>NOVITA\'</b>: puoi creare la tua rete di amicizie con /info, vedere cosa pensano i tuoi amici degli altri utenti e ci sono i nuovi tavoli riservati per registrati e apprendisti, corretti alcuni errori.',
'Se vuoi iscriverti alla <a target="_blank" href="mailto:ml-briscola+subscribe@milug.org">Mailing List</a>, cliccala!' ),
- 'en' => array ( 'Brisk (Ver. '.$G_brisk_version.'), <b>NEWS</b>: ENcomando /info e doppio click sugli utenti registrati, nuovi utenti apprendisti.',
- 'If you want to subscribe our <a target="_blank" href="ml-briscola+subscribe@milug.org">Mailing List</a>, click it!' ) );
+ 'en' => array ( 'EN Brisk (Ver. '.$G_brisk_version.'), <b>NOVITA\'</b>: puoi creare la tua rete di amicizie con /info,',
+ 'vedere cosa pensano i tuoi amici degli altri utenti e tavoli riservati per registrati e apprendisti.',
+ 'Se vuoi iscriverti alla <a target="_blank" href="mailto:ml-briscola+subscribe@milug.org">Mailing List</a>, cliccala!' ) );
$G_room_help = array( 'it' => '
<div style=\\"text-align: left; padding: 8px;\\">
}
define('TABLE_AUTH_TY_PUBL', 0);
-define('TABLE_AUTH_TY_AUTH', 1);
-define('TABLE_AUTH_TY_CERT', 2);
+define('TABLE_AUTH_TY_APPR', 1);
+define('TABLE_AUTH_TY_AUTH', 2);
+define('TABLE_AUTH_TY_CERT', 3);
class Table {
$thiz->auth_type = TABLE_AUTH_TY_CERT;
else if ($idx < TABLES_AUTH_N)
$thiz->auth_type = TABLE_AUTH_TY_AUTH;
+ else if ($idx < TABLES_APPR_N)
+ $thiz->auth_type = TABLE_AUTH_TY_APPR;
else
$thiz->auth_type = TABLE_AUTH_TY_PUBL;
else
$act = 'reserved';
break;
+ case TABLE_AUTH_TY_APPR:
+ if ($user->is_auth())
+ $act = "sitappr";
+ else
+ $act = 'reserved';
+ break;
default:
$act = 'sit';
break;
}
}
- function info_show($user, $user_login, $dt)
+ /*
+ function info_show($user, $target, $dt)
+
+ if success return assoc. array with "ret" => 0 and other fields
+ else return an assoc. array with "ret: != 0 and "mesg" with an error description
+ */
+ function info_show($user, $target, $dt)
{
GLOBAL $G_lang, $mlang_brisk, $G_base;
$ret = 0;
do {
- if ($user_login == "") {
+ if ($target == "") {
$ret = 1;
break;
}
$ret = 2;
break;
}
- if (($user_item = $bdb->getitem_bylogin($user_login, $user_code)) == FALSE) {
+ if ($target == $user->name) {
$ret = 3;
+ $mesg = sprintf($mlang_brisk['inf_self'][$G_lang]);
break;
}
- if ($user_login == $user->name) {
+ if (($user_item = $bdb->getitem_bylogin($target, $user_code)) == FALSE) {
$ret = 4;
- $mesg = sprintf($mlang_brisk['inf_self'][$G_lang]);
break;
}
if (($guar_item = $bdb->getitem_bycode($user_item->guar_code_get())) != FALSE) {
}
$user_tos_vers = $user_item->tos_vers_get();
+ $partyskill = $bdb->usersnet_partyskill($user->code, $user_item->code);
+
+ $widefriend = $bdb->usersnet_widefriend($user->code, $user_item->code);
+ $widefriend['skill'] = $bdb->usersnet_wideskill($user->code, $user_item->code);
+ $narrowfriend = $bdb->usersnet_narrowfriend($user->code, $user_item->code);
+ $narrowfriend['skill'] = $bdb->usersnet_narrowskill($user->code, $user_item->code);
+
+ if (($usersnet_item = $bdb->usersnet_bycode($user->code, $user_item->code,
+ $widefriend, $narrowfriend)) == FALSE) {
+ $usersnet_item = $bdb->usersnet_default($user->code, $user_item->code,
+ $widefriend, $narrowfriend);
+ }
+
if (versions_cmp($user_tos_vers, "1.2") < 0) {
- $mesg = sprintf($mlang_brisk['tos_old'][$G_lang], xcape($user_login));
+ $mesg = sprintf($mlang_brisk['tos_old'][$G_lang], xcape($target));
}
else if ($guar_login == "") {
- $mesg = sprintf($mlang_brisk['inf_nfd'][$G_lang], xcape($user_login));
+ $mesg = sprintf($mlang_brisk['inf_nfd'][$G_lang], xcape($target));
}
} while (0);
else {
$jret = json_encode(array("ret" => 0,
"mesg" => "",
- "login" => $user_login,
+ "login" => $target,
// FIXME: state internationalization
"state" =>
($user_item->type & USER_FLAG_TY_APPR ? "Apprendista" :
"Normale" : "Stato sconosciuto"))),
"guar" => ($user_item->type & USER_FLAG_TY_APPR ?
"" : $guar_login),
+ "party" => $partyskill,
"match" => (versions_cmp($user_tos_vers, "1.4") < 0 ? "non autorizzato" : $user_item->match_cnt) ,
"game" => (versions_cmp($user_tos_vers, "1.4") < 0 ? "non autorizzato" : $user_item->game_cnt),
- "friend" => "unknown"));
+ "friend" => usersnet_friend_getlabel($usersnet_item->friend),
+ "skill" => $usersnet_item->skill,
+ "trust" => $usersnet_item->trust,
+ "widefriend" => $usersnet_item->widefriend,
+ "narrowfriend" => $usersnet_item->narrowfriend
+ ));
}
return $jret;
}
+ function info_save($user, $json_s)
+ {
+ GLOBAL $G_lang, $mlang_brisk, $G_base;
+
+ $mesg = "";
+ $user_code = -1;
+ $ret = 0;
+ $subret = 0;
+
+ do {
+ if (($json = json_decode($json_s)) == FALSE) {
+ $ret = 1;
+ break;
+ }
+
+ if (($bdb = BriskDB::create()) == FALSE) {
+ $ret = 2;
+ break;
+ }
+
+ if (($subret = $bdb->usersnet_save($user->code, $json)) != 0) {
+ $ret = 4000 + $subret;
+ break;
+ }
+ } while(0);
+
+ return ($ret);
+ }
+
function room_outstandup($user)
{
$this->room_sitdown($user, -1);
return ($this->kickuser($user_out, $out_reas));
}
- function chatt_send($user, $mesg)
+ function chatt_send($user, $mesg, $mlang_indwr = NULL)
{
GLOBAL $G_base, $G_alarm_passwd, $mlang_brisk, $G_lang;
$only_you = FALSE;
if (($bdb = BriskDB::create()) != FALSE) {
$bdb->users_load();
/* MLANG: "Il nickname <b>\'%s\'</b> è già registrato, <b>se il suo proprietario si autentificherà verrai rinominato d\'ufficio come ghost<i>N</i>.</b>" */
- if ($bdb->login_exists($name_new)) {
+ if ($bdb->login_exists(strtolower($name_new))) {
$prestr = sprintf($mlang_brisk['nickjust'][$G_lang], xcape($name_new));
$to_user .= nickserv_msg($dt, $prestr);
}
} while (0);
} // nick chat command
else if (strncmp($msg, "/info ", 6) == 0) {
- $guar_user = substr($msg, 6);
+ do {
+ if (! $user->is_auth()) {
+ if ($mlang_indwr) {
+ $to_user = nickserv_msg($dt, $mlang_indwr['info_auth'][$G_lang]);
+ }
+ else {
+ $to_user = nickserv_msg($dt, "error");
+ }
+ break;
+ }
+ $info_user = substr($msg, 6);
- error_log("here [" . $guar_user."]");
- echo $this->info_show($user, $guar_user, $dt);
+ echo $this->info_show($user, urldecode($info_user), $dt);
+ } while(0);
}
else if (strncmp($msg, "/st ", 4) == 0) {
log_main("chatt_send BEGIN");
}
}
else {
- $login_exists = $bdb->login_exists($name_new);
+ $login_exists = $bdb->login_exists(strtolower($name_new));
}
}
else {
}
}
+function login_consistency($name)
+{
+ $old_c = '';
+ if (($len = mb_strlen($name)) > 12) {
+ return FALSE;
+ }
+ for ($i = 0 ; $i < mb_strlen($name) ; $i++) {
+ $c = mb_substr($name, $i, 1);
+ if (mb_ereg_match ("[a-zA-Z0-9]", $c)) {
+ if ($old_c != $c) {
+ $old_c = $c;
+ $old_ct = 1;
+ }
+ else {
+ $old_ct++;
+ if ($old_ct > 2) {
+ return (FALSE);
+ }
+ }
+ }
+ else {
+ return (FALSE);
+ }
+ }
+ return (TRUE);
+}
?>
* brisk - dbase_base.phh
*
* Copyright (C) 2011-2012 Matteo Nastasi
- * mailto: nastasi@alternativeoutput.it
+ * mailto: nastasi@alternativeoutput.it
* matteo.nastasi@milug.org
* web: http://www.alternativeoutput.it
*
static function LoginDBItemFromRecord($rec)
{
- $ret = new LoginDBItem($rec->code, $rec->login, $rec->pass,
+ $ret = new LoginDBItem($rec->code, $rec->login, $rec->pass,
$rec->email, $rec->type, $rec->last_dona,
$rec->supp_comp, $rec->tos_vers, $rec->disa_reas, $rec->guar_code,
$rec->match_cnt, $rec->game_cnt);
{
return $this->login;
}
-
+
function pass_get()
{
return $this->pass;
return $bdb->mail_add_fromitem($this);
}
}
+
+define('USERSNET_DEF_FRIEND', 2);
+define('USERSNET_DEF_SKILL', 2);
+define('USERSNET_DEF_TRUST', 2);
+
+class UsersNetItem {
+ var $owner;
+ var $target;
+ var $friend;
+ var $skill;
+ var $trust;
+
+ var $from_db;
+
+ function UsersNetItem($owner, $target, $friend, $skill, $trust,
+ $widefriend, $narrowfriend, $from_db)
+ {
+ $this->owner = $owner;
+ $this->target = $target;
+ $this->friend = $friend;
+ $this->skill = $skill;
+ $this->trust = $trust;
+ $this->widefriend = $widefriend;
+ $this->narrowfriend = $narrowfriend;
+
+ $this->from_db = $from_db;
+ }
+
+ static function UsersNetItemFromRecord($rec, $widefriend, $narrowfriend)
+ {
+ $ret = new UsersNetItem($rec->owner, $rec->target, $rec->friend,
+ $rec->skill, $rec->trust,
+ $widefriend, $narrowfriend, TRUE);
+
+ return ($ret);
+ }
+
+ static function UsersNetItemDefaults($owner, $target, $widefriend, $narrowfriend)
+ {
+ $ret = new UsersNetItem($owner, $target, USERSNET_DEF_FRIEND,
+ USERSNET_DEF_SKILL, USERSNET_DEF_TRUST,
+ $widefriend, $narrowfriend, FALSE);
+
+ return ($ret);
+ }
+
+
+}
+
?>
\ No newline at end of file
require_once("${G_base}Obj/dbase_base.phh");
$escsql_from = array( "\\", "'" );
-$escsql_to = array( "\\\\", "\\'" );
+$escsql_to = array( "\\\\", "''" );
function escsql($s)
{
static function destroy()
{
if (DBConn::$dbcnnx != FALSE) {
+ $ret = pg_close(DBConn::$dbcnnx);
DBConn::$dbcnnx = FALSE;
- return (pg_close(DBConn::$dbcnnx));
+ return ($ret);
}
return TRUE;
}
function query($sql)
{
- if (($res = pg_query($this->dbconn->db(), $sql)) == FALSE) {
+ if (!$this->dbconn)
+ if (($this->dbconn = DBConn::recover()) == FALSE)
+ return FALSE;
+
+ if (($res = @pg_query($this->dbconn->db(), $sql)) == FALSE) {
+ error_log('pg_result_status: ' . pg_result_status($res));
+ error_log('pg_connection_status: ' . pg_connection_status($this->dbconn->db()));
// try to recover the connection
if (($this->dbconn = DBConn::recover()) == FALSE)
return FALSE;
- return (pg_query($this->dbconn->db(), $sql));
+ return (@pg_query($this->dbconn->db(), $sql));
}
return ($res);
/* check the existence of the nick in the BriskDB */
log_main("login_exists: ".$login);
- $user_sql = sprintf("SELECT * FROM %susers WHERE login = lower('%s')",
+ $user_sql = sprintf("SELECT * FROM %susers WHERE login = '%s'",
$G_dbpfx, escsql($login));
if (($user_pg = $this->query($user_sql)) != FALSE)
if (pg_numrows($user_pg) == 1)
return (FALSE);
}
- if (($sere_pg = $this->query($sere_sql)) == FALSE) {
- return (FALSE);
- }
-
$sere_sql = sprintf("SELECT * FROM %sselfreg_chk WHERE (ip & %d) = %d;",
$G_dbpfx, int2four($G_selfreg_mask), int2four($laddr & $G_selfreg_mask));
if (($sere_pg = $this->query($sere_sql)) == FALSE) {
$user_sql = sprintf("UPDATE %susers SET (type, supp_comp) = (%d, '%s') WHERE code = %d;",
$G_dbpfx, $flags, escsql($supp_comp), $code);
- fprintf(STDERR, "REQUEST [%s]\n", $user_sql);
if ( ! (($user_pg = $this->query($user_sql)) != FALSE && pg_affected_rows($user_pg) == 1) ) {
return FALSE;
}
- fprintf(STDERR, "REQUEST GOOD [%s]\n", $user_sql);
return TRUE;
}
$user_sql = sprintf("UPDATE %susers SET (type, disa_reas) = (%d, %d) WHERE code = %d;",
$G_dbpfx, $flags, $disa_reas, $code);
- fprintf(STDERR, "REQUEST [%s]\n", $user_sql);
if ( ! (($user_pg = $this->query($user_sql)) != FALSE && pg_affected_rows($user_pg) == 1) ) {
return FALSE;
}
- fprintf(STDERR, "REQUEST GOOD [%s]\n", $user_sql);
return TRUE;
}
$user_sql = sprintf("UPDATE %susers SET (tos_vers) = ('%s') WHERE code = %d;",
$G_dbpfx, escsql($tos_vers), $code);
- fprintf(STDERR, "REQUEST [%s]\n", $user_sql);
if ( ! (($user_pg = $this->query($user_sql)) != FALSE && pg_affected_rows($user_pg) == 1) ) {
return FALSE;
}
- fprintf(STDERR, "REQUEST GOOD [%s]\n", $user_sql);
return TRUE;
}
return (TRUE);
}
+ function friendship_default()
+ {
+ return (array(usersnet_friend_getlabel(1) => "0",
+ usersnet_friend_getlabel(2) => "0",
+ usersnet_friend_getlabel(3) => "0",
+ usersnet_friend_getlabel(4) => "0",
+ usersnet_friend_getlabel(5) => "0"));
+ }
+
+ function usersnet_widefriend($owner, $target)
+ {
+ GLOBAL $G_dbpfx;
+
+ $widefriend = $this->friendship_default();
+
+ $wfri_sql = sprintf("SELECT * FROM %susersnet_widefriend WHERE owner = %d AND target = %d;",
+ $G_dbpfx, $owner, $target);
+ if (($wfri_pg = $this->query($wfri_sql)) == FALSE) {
+ return ($widefriend);
+ }
+
+ for ($i = 0 ; $i < pg_numrows($wfri_pg) ; $i++) {
+ $wfri_obj = pg_fetch_object($wfri_pg, $i);
+ $widefriend[usersnet_friend_getlabel(intval($wfri_obj->friend))] = $wfri_obj->count;
+ }
+
+ return ($widefriend);
+ }
+
+ function usersnet_wideskill($owner, $target)
+ {
+ GLOBAL $G_dbpfx;
+
+ $wideskill = "//";
+ $wskl_sql = sprintf("SELECT * FROM %susersnet_wideskill WHERE owner = %d AND target = %d;",
+ $G_dbpfx, $owner, $target);
+ if (($wskl_pg = $this->query($wskl_sql)) == FALSE) {
+ return ($wideskill);
+ }
+
+ if (pg_numrows($wskl_pg) > 0) {
+ $wskl_obj = pg_fetch_object($wskl_pg, 0);
+ // TODO: UNCOMMENT IF THE NETWORK WORKS VERY WELL
+ // if ($wskl_obj->count >= 3)
+ $wideskill = sprintf("%3.2f", $wskl_obj->skill);
+ }
+ return ($wideskill);
+ }
+
+ function usersnet_narrowfriend($owner, $target)
+ {
+ GLOBAL $G_dbpfx;
+
+ $narrowfriend = $this->friendship_default();
+
+ $nfri_sql = sprintf("SELECT * FROM %susersnet_narrowfriend WHERE owner = %d AND target = %d;",
+ $G_dbpfx, $owner, $target);
+ if (($nfri_pg = $this->query($nfri_sql)) == FALSE) {
+ return $narrowfriend;
+ }
+
+ for ($i = 0 ; $i < pg_numrows($nfri_pg) ; $i++) {
+ $nfri_obj = pg_fetch_object($nfri_pg, $i);
+ $narrowfriend[usersnet_friend_getlabel(intval($nfri_obj->friend))] = $nfri_obj->count;
+ }
+ return ($narrowfriend);
+ }
+
+ function usersnet_narrowskill($owner, $target)
+ {
+ GLOBAL $G_dbpfx;
+
+ $narrowskill = "//";
+
+ $nskl_sql = sprintf("SELECT * FROM %susersnet_narrowskill WHERE owner = %d AND target = %d;",
+ $G_dbpfx, $owner, $target);
+ if (($nskl_pg = $this->query($nskl_sql)) == FALSE) {
+ return ($narrowskill);
+ }
+
+ if (pg_numrows($nskl_pg) > 0) {
+ $nskl_obj = pg_fetch_object($nskl_pg, 0);
+ // TODO: UNCOMMENT IF THE NETWORK WORKS VERY WELL
+ // if ($nskl_obj->count >= 3)
+ $narrowskill = sprintf("%3.2f", $nskl_obj->skill);
+ }
+ return ($narrowskill);
+ }
+
+ function usersnet_partyskill($owner, $target)
+ {
+ GLOBAL $G_dbpfx;
+
+ $partyskill = "non disponibile";
+
+ $pskl_sql = sprintf("SELECT * FROM %susersnet_party WHERE owner = %d AND target = %d;",
+ $G_dbpfx, $owner, $target);
+ if (($pskl_pg = $this->query($pskl_sql)) == FALSE) {
+ return ($partyskill);
+ }
+
+ if (pg_numrows($pskl_pg) > 0) {
+ $pskl_obj = pg_fetch_object($pskl_pg, 0);
+ // TODO: UNCOMMENT IF THE NETWORK WORKS VERY WELL
+ // if ($wskl_obj->count >= 3)
+ $partyskill = sprintf("%3.2f", $pskl_obj->skill);
+ }
+ return ($partyskill);
+ }
+
+ function usersnet_bycode($owner, $target, $widefriend, $narrowfriend)
+ {
+ GLOBAL $G_dbpfx;
+ $ret = FALSE;
+
+ $net_sql = sprintf("SELECT * FROM %susersnet WHERE owner = %d AND target = %d;",
+ $G_dbpfx, $owner, $target);
+ if (($net_pg = $this->query($net_sql)) == FALSE)
+ return FALSE;
+
+ if (pg_numrows($net_pg) != 1)
+ return FALSE;
+
+ $net_obj = pg_fetch_object($net_pg, 0);
+
+ return (UsersNetItem::UsersNetItemFromRecord($net_obj, $widefriend, $narrowfriend));
+ }
+
+ function usersnet_default($owner, $target, $widefriend, $narrowfriend)
+ {
+ return (UsersNetItem::UsersNetItemDefaults($owner, $target, $widefriend, $narrowfriend));
+ }
+
+ function usersnet_save($owner_id, $json)
+ {
+ GLOBAL $G_dbpfx;
+ $ret = 99999;
+ $trans = FALSE;
+
+ do {
+ $friend = usersnet_friend_getid($json->friend);
+
+ $json->skill = intval($json->skill);
+ $json->trust = intval($json->trust);
+
+ if ($json->skill < 1 || $json->skill > 5 ||
+ $json->trust < 1 || $json->trust > 5 ||
+ $friend == FALSE) {
+ $ret = 1;
+ break;
+ }
+ $this->transaction('BEGIN');
+ $trans = TRUE;
+
+ if ($friend == USERSNET_FRIEND_UNKNOWN) {
+ // try to update
+ $net_sql = sprintf("
+ DELETE FROM %susersnet
+ USING %susers as us
+ WHERE owner = %d AND us.login = '%s' AND target = us.code;",
+ $G_dbpfx, $G_dbpfx,
+ $owner_id, escsql(strtolower($json->login)));
+
+ if (($net_pg = $this->query($net_sql)) == FALSE) {
+ $ret = 5;
+ break;
+ }
+ }
+ else { // if ($friend == USERSNET_FRIEND_UNKNOWN
+ // try to update
+ $net_sql = sprintf("
+ UPDATE %susersnet SET (friend, skill, trust, mtime) =
+ (%d, %d, %d, now())
+ FROM %susers as us
+ WHERE owner = %d AND us.login = '%s' AND target = us.code RETURNING *;",
+ $G_dbpfx,
+ $friend, $json->skill, $json->trust,
+ $G_dbpfx,
+ $owner_id, escsql(strtolower($json->login)));
+ if (($net_pg = $this->query($net_sql)) == FALSE || pg_numrows($net_pg) == 0) {
+ $net_sql = sprintf("
+ INSERT INTO %susersnet SELECT %d AS owner, us.code as target,
+ %d as friend, %d as skill, %d as trust
+ FROM %susers as us WHERE us.login = '%s' RETURNING *;",
+ $G_dbpfx, $owner_id,
+ $friend, $json->skill, $json->trust,
+ $G_dbpfx, escsql(strtolower($json->login)));
+ if (($net_pg = $this->query($net_sql)) == FALSE) {
+ log_wr('insert query failed');
+ $ret = 2;
+ break;
+ }
+ if (pg_numrows($net_pg) != 1) {
+ log_wr(sprintf('insert numrow failed [%s] [%d]', $net_sql, pg_numrows($net_pg)));
+ $ret = 3;
+ break;
+ }
+ }
+ else {
+ if (pg_numrows($net_pg) != 1) {
+ log_wr('update numrow failed');
+ $ret = 4;
+ break;
+ }
+ }
+ }
+ $this->transaction('COMMIT');
+ return (0);
+ } while (0);
+
+ if ($trans)
+ $this->transaction('ROLLBACK');
+
+ return ($ret);
+ }
} // End class BriskDB
class LoginDBOld
declare(ticks = 1);
+/* this list is created with bin/get_globals.sh */
+$_globals_list = array(
+'G_admin_mail', 'G_alarm_passwd', 'G_all_points', 'G_ban_list', 'G_base',
+'G_black_list', 'G_brisk_version', 'G_btrace_pref_sub', 'G_cloud_smasher',
+'G_crypt_key', 'G_dbasetype', 'G_dbauth', 'G_dbpfx', 'G_doc_path',
+'G_domain', 'G_donors_all', 'G_donors_cur', 'G_is_local', 'G_lang', 'G_lng',
+'G_mail_seed', 'G_notguar_code', 'G_PG_cons', 'G_PG_cons_n', 'G_PG_vow',
+'G_PG_vow_n', 'G_poll_entries', 'G_poll_name', 'G_poll_title',
+'G_provider_proxy', 'G_proxy_white_list', 'G_room_about', 'G_room_help',
+'G_room_passwdhowto', 'G_room_roadmap',
+'G_selfreg_mask', 'G_selfreg_tout', 'G_shutdown', 'G_sidebanner',
+'G_sidebanner_idx', 'G_splash_content', 'G_splash_contents',
+'G_splash_cont_idx', 'G_splash_h', 'G_splash_idx', 'G_splash_interval',
+'G_splash_timeout', 'G_splash_w', 'G_topbanner', 'G_tos_dthard',
+'G_tos_dtsoft', 'G_tos_fname', 'G_tos_idx', 'G_tos_vers', 'G_webbase');
+
function global_dump()
{
GLOBAL $G_alarm_passwd, $G_ban_list, $G_black_list, $G_btrace_pref_sub, $G_dbauth;
GLOBAL $G_splash_h, $G_splash_idx, $G_splash_interval, $G_splash_timeout;
GLOBAL $G_splash_w, $G_topbanner, $G_with_donors, $G_with_poll;
GLOBAL $G_with_splash, $G_sidebanner, $G_sidebanner_idx;
- GLOBAL $G_with_topbanner, $G_selfreg_tout;
+ GLOBAL $G_with_topbanner, $G_selfreg_tout, $G_selfreg_mask;
fprintf(STDERR, "G_alarm_passwd = [%s]\n", print_r($G_alarm_passwd, TRUE));
fprintf(STDERR, "G_ban_list = [%s]\n", print_r($G_ban_list, TRUE));
$this->app->users_cleanup();
}
+ function check_globals()
+ {
+ GLOBAL $_globals_list;
+ foreach ($_globals_list as $g) {
+ if (!array_search($g, $GLOBALS) || !isset($GLOBALS[$g])) {
+ error_log(sprintf("Global [%s] not declared", $g));
+ return FALSE;
+ }
+ }
+ return TRUE;
+ }
+
function run()
{
GLOBAL $DOCUMENT_ROOT, $HTTP_HOST;
GLOBAL $G_with_topbanner;
GLOBAL $G_tos_vers, $G_tos_fname, $G_tos_dtsoft, $G_tos_dthard, $G_tos_idx, $G_doc_path;
+ if (!$this->check_globals()) {
+ fprintf(STDERR, "Take a look to the phplog file, GLOBALS missing!\n");
+ sleep(10);
+ }
+
if ($this->main_loop) {
return (FALSE);
}
$this->reload(FALSE, $G_provider_proxy);
$this->app->reload(FALSE, $G_ban_list, $G_black_list,
$G_cloud_smasher);
+ if (!$this->check_globals()) {
+ fprintf(STDERR, "Take a look to the phplog file, GLOBALS missing!\n");
+ sleep(10);
+ }
global_dump();
}
else if ($line == "shutdown" || $line == "sd") {
} // end class User
+define('USERSNET_FRIEND_BLACK', 1);
+define('USERSNET_FRIEND_UNKNOWN', 2);
+define('USERSNET_FRIEND_TEST', 3);
+define('USERSNET_FRIEND_FRIEND', 4);
+define('USERSNET_FRIEND_BFF', 5);
+
+if (!isset($__usersnet_friend_map)) {
+ $__usersnet_friend_map = array("black", "unknown", "test", "friend", "bff");
+}
+
+function usersnet_friend_getlabel($id)
+{
+ GLOBAL $__usersnet_friend_map;
+
+ $id_i = intval($id);
+
+ if ($id_i < 1 || $id_i > count($__usersnet_friend_map)) {
+ return FALSE;
+ }
+ return ($__usersnet_friend_map[$id_i - 1]);
+}
+
+/* return index + 1 of friend label */
+function usersnet_friend_getid($label_in)
+{
+ GLOBAL $__usersnet_friend_map;
+ foreach ($__usersnet_friend_map as $id => $label) {
+ if ($label == $label_in) {
+ return ($id + 1);
+ }
+ }
+
+ return FALSE;
+}
?>
}
body {
- background-image: url('img/najole.png');
+ background-image: url('img/najole_wh.png');
background-color: #fafafa;
background-attachment: fixed;
margin: 0px;
-moz-border-radius: 8px;
border-radius: 8px;
- background-image: url('img/najole_light.png');
+ background-image: url('img/najole_wh_light.png');
background-attachment: fixed;
top: 0;
span.au0 span {
font-weight: bold;
}
+span.au0_off span {
+ font-weight: bold;
+}
span.au1 span {
padding-left: 2px;
padding-right: 4px;
font-style: italic;
-/* orange background-color: #ffd780; */
-/* red background-color: #ffb0b0; */
+ background-color: #a1c8ff;
+}
+span.au1_off span {
+ padding-left: 2px;
+ padding-right: 4px;
+ font-style: italic;
background-color: #a1c8ff;
}
span.au2 span {
background-color: #bafcba;
}
+span.au2_off span {
+ background-color: #bafcba;
+}
span.au3 {
padding-left: 24px;
background-position: left center;
}
+span.au3_off span {
+ background-color: transparent;
+}
+span.au3_off {
+}
+
span.au3 span {
background-color: transparent;
}
}
- function chatt_send($user, $mesg)
+ function chatt_send($user, $mesg, $mlang_indwr = NULL)
{
GLOBAL $mlang_brisk, $G_lang;
send_mesg("roadmap");
}
-function act_whysupport()
-{
- send_mesg("whysupport");
-}
-
function act_lascio()
{
send_mesg("lascio");
for (i = 0 ; i < 4 ; i++) {
if (flags & (1 << i)) {
- cl += sp + "au" + i;
+ cl += sp + "au" + i + (is_real ? "" : "_off");
sp = " ";
}
}
+function ends_with(s, suffix)
+{
+ if (s.indexOf(suffix, s.length - suffix.length) !== -1) {
+ return true;
+ }
+ return false;
+}
+
+function __ffa_nav(obj, ret, name)
+{
+ var arr;
+
+ arr = obj.className.split(" ");
+ if (arr.indexOf(name + "_id") != -1) {
+ ret.push(obj);
+ return;
+ }
+
+ // check if the current element is a leaf or a node
+ // if it is then return
+ for (var i = 0 ; i < arr.length ; i++) {
+ if (ends_with(arr[i], "_id")) {
+ return;
+ }
+ }
+
+ for (var i = 0 ; i < obj.children.length ; i++) {
+ __ffa_nav(obj.children[i], ret, name);
+ }
+ return;
+}
+
+function fieldify_get_dom_element(objarr, name)
+{
+ var obj, ret = [];
+
+ for (var i = 0 ; i < objarr.length ; i++) {
+ obj = objarr[i];
+ for (var e = 0 ; e < obj.children.length ; e++) {
+ __ffa_nav(obj.children[e], ret, name);
+ }
+ }
+
+ if (ret.length > 0) {
+ return ret;
+ }
+ return false;
+}
// fieldsdescr = { name: { type: 'typename' }, ... }
-function Fieldify(ancestor, fieldsdescr)
+function Fieldify(dom_elements, fieldsdescr)
{
- this.ancestor = ancestor;
-
+ var item;
+
+ this.dom_elements = dom_elements;
this.field = new Array();
for (k in fieldsdescr) {
this.field[k] = fieldsdescr[k];
+ if (this.field[k].type == 'fields') {
+ if (item = fieldify_get_dom_element(this.dom_elements, k)) {
+ this.field[k].obj = new Fieldify(item, this.field[k].fields);
+ }
+ }
}
}
Fieldify.prototype = {
- ancestor: null,
+ dom_elements: null,
field: null,
-
+
visible: function(is_visible) {
- this.ancestor.style.visibility = (is_visible ? "visible" : "hidden" );
+ this.dom_elements[0].style.visibility = (is_visible ? "visible" : "hidden" );
},
// { 'name': 'value' }
- populate: function(field_values)
+ json2dom: function(field_values)
{
for (k in this.field) {
if (this.field[k].type == 'value') {
else if (this.field[k].type == 'radio') {
this.fld_radio_set(k, field_values[k]);
}
+ else if (this.field[k].type == 'fields') {
+ this.field[k].obj.json2dom(field_values[k]);
+ }
+ }
+ },
+
+ dom2json: function()
+ {
+ var ret = {};
+ for (k in this.field) {
+ if (this.field[k].perms == 'ro')
+ continue;
+ if (this.field[k].type == 'value') {
+ ret[k] = this.fld_value_get(k);
+ }
+ else if (this.field[k].type == 'radio') {
+ ret[k] = this.fld_radio_get(k);
+ }
+ else if (this.field[k].type == 'fields') {
+ ret[k] = this.field[k].obj.dom2json();
+ }
}
+ return ret;
},
fld_value_set: function(name, value)
{
- console.log(name + "=" + value);
- this.ancestor.getElementsByClassName(name + '_id')[0].innerHTML = value;
+ var item = fieldify_get_dom_element(this.dom_elements, name);
+ if (item) {
+ item[0].innerHTML = value;
+ }
+ },
+
+ fld_value_get: function(name)
+ {
+ var item = fieldify_get_dom_element(this.dom_elements, name);
+ if (item) {
+ return (item[0].innerHTML);
+ }
+ return false;
},
-
+
fld_radio_set: function(name, value)
{
- var arr = this.ancestor.getElementsByClassName(name + '_id');
-
- console.log(name + "=" + value);
+ var arr = fieldify_get_dom_element(this.dom_elements, name);
+ if (arr) {
+ for (k in arr) {
+ if (arr[k].value == value)
+ arr[k].checked = true;
+ else
+ arr[k].checked = false;
+ }
+ }
+ },
- for (k in arr) {
- if (arr[k].value == value)
- arr[k].checked = true;
- else
- arr[k].checked = false;
+ fld_radio_get: function(name)
+ {
+ var ret = null;
+ var arr = fieldify_get_dom_element(this.dom_elements, name);
+ if (arr) {
+ for (k in arr) {
+ if (arr[k].checked == true) {
+ ret = arr[k].value;
+ break;
+ }
+ }
}
+ return ret;
},
+
tap: null
}
'en' => 'Send a message to the administrator:'),
'mesgtoadm_sub'=> array('it' => 'soggetto:',
'en' => 'subject:'),
- 'info_login' => array('it' => 'Utente:',
- 'en' => 'User:'),
- 'info_state' => array('it' => 'Stato:',
- 'en' => 'State:'),
- 'info_guar' => array('it' => 'Garante:',
- 'en' => 'Guarantee:'),
- 'info_match' => array('it' => 'Partite:',
- 'en' => 'Matches:'),
- 'info_game' => array('it' => 'Mani:',
- 'en' => 'Hands:'),
+ 'info_login' => array('it' => 'Utente',
+ 'en' => 'User'),
+ 'info_status' => array('it' => 'Stato',
+ 'en' => 'Status'),
+ 'info_status_tit' => array('it' => 'Stato dell\' utente.',
+ 'en' => 'User status.'),
+ 'info_guar' => array('it' => 'Garante',
+ 'en' => 'Guarantee'),
+ 'info_match' => array('it' => 'Partite',
+ 'en' => 'Matches'),
+ 'info_match_tit' => array('it' => 'Partite giocate ai tavoli riservati.',
+ 'en' => 'Matches played at reserved tables.'),
+ 'info_party' => array('it' => 'Party',
+ 'en' => 'Party'),
+ 'info_party_tit' => array('it' => 'Bravura calcolata in base ad amici, agli amici fidati e agli amici degli amici fidati in base alla credibilità degli amici fidati.',
+ 'en' => 'Skill calculated with party rules.'),
+ 'info_game' => array('it' => 'Mani',
+ 'en' => 'Hands'),
+ 'info_game_tit' => array('it' => 'Mani giocate ai tavoli riservati.',
+ 'en' => 'Hands played at reserved tables.'),
'info_frie' => array('it' => 'Conoscenza:',
'en' => 'Friendship:'),
+ 'info_repfrie' => array('it' => 'Cosa ne pensano gli amici',
+ 'en' => 'Friends reputation'),
+ 'info_repbff' => array('it' => 'Cosa ne pensano gli amici fidati',
+ 'en' => 'Best friends reputation'),
+ 'info_skill' => array('it' => 'Bravura',
+ 'en' => 'Skill')
);
require_once("briskin5/Obj/briskin5.phh");
<table width="100%%" border="0" cols="3"><tr>
<td align="left"><div style="padding-left: 8px;">'.$banner_top_left.'</div></td>
<td align="center">'.(($G_with_topbanner || $G_with_donors) ? '<table><tr><td>' : '').'<div style="text-align: center;">
- <img class="nobo" src="img/brisk_logo64.png">
+ <!--<img class="nobo" src="img/brisk_logo64.png">--><img class="nobo" src="img/brisk_logo64_blackribbon.png" title="ciao grrr">
'.$mlang_room['headline'][$G_lang].'<br>
</div>'.( ($G_with_topbanner || $G_with_donors) ? sprintf('</td><td>%s</td></tr></table>',
($G_with_topbanner ? $G_topbanner :
alt="'.$mlang_room['tit_cook'][$G_lang].'">'.$mlang_room['itm_cook'][$G_lang].'</a><br>
<hr>
-<!--
-<a href="#"
- onmouseover="menu_hide(0,1);"
- title="perché supportare brisk?" onclick="act_whysupport();">supportare?</a><br>
--->
<a href="#"
onmouseover="menu_hide(0,1);"
title="'.$mlang_room['tit_cla'][$G_lang].'" onclick="act_placing();">'.$mlang_room['itm_cla'][$G_lang].'</a><br>
<a href="http://it-it.facebook.com/event.php?eid=165523204539&index=1"
target="_blank" onmouseover="menu_hide(0,2);"
- title="1° Torneo-Meeting di Parma del 22/11/2009" <img style="display: inline;" class="nobo" src="img/coppa16.png">Parma 11/09</a><br>
+ title="1° Torneo-Meeting di Parma del 22/11/2009"><img style="display: inline;" class="nobo" src="img/coppa16.png">Parma 11/09</a><br>
<a href="http://it-it.facebook.com/event.php?eid=105699129890&index=1"
target="_blank" onmouseover="menu_hide(0,2);"
<div style="position: absolute;">
'.$altout_support_big.'
</div>
-<a style="/* position: absolute; top: 40px; left: 6px;" */ target="_blank" href="http://it-it.facebook.com/group.php?gid=59742820791"><img class="nobo" id="btn_facebook" src="img/facebook_btn.png" title="unisciti al gruppo \'quelli della brisk\'"></a>
+<a style="/* position: absolute; top: 40px; left: 6px; */" target="_blank" href="http://it-it.facebook.com/group.php?gid=59742820791"><img class="nobo" id="btn_facebook" src="img/facebook_btn.png" title="unisciti al gruppo \'quelli della brisk\'"></a>
' . ( /* NOTE: here facebook or fake facebook */
(!$G_is_local && $_cookie_law_3party == 'true') ?
'<div class="fb-like" style="margin-top: 4px;" data-href="https://www.facebook.com/pages/Brisk-briscola-chiamata-in-salsa-ajax/716026558416911" data-share="false" data-send="true" data-width="70" data-show-faces="false" data-colorscheme="dark" layout="button_count"></div>
<script type="text/javascript" src="commons.js"></script>
<script type="text/javascript" src="fieldify.js"></script>
<script type="text/javascript" src="prefs.js"></script>
+<script type="text/javascript" src="info.js"></script>
<!-- <script type="text/javascript" src="myconsole.js"></script> -->
<script type="text/javascript" src="menu.js"></script>
<script type="text/javascript" src="heartbit.js"></script>
var g_lang = "<? echo $G_lang; ?>";
var g_lng = "<? echo $G_lng; ?>";
var g_tables_n = <? echo TABLES_N; ?>;
+var g_tables_appr_n = <? echo TABLES_APPR_N; ?>;
var g_tables_auth_n = <? echo TABLES_AUTH_N; ?>;
var g_tables_cert_n = <? echo TABLES_CERT_N; ?>;
var g_prefs, g_prefs_new = null;
<script type="text/javascript" src="commons.js"></script>
<script type="text/javascript" src="fieldify.js"></script>
<script type="text/javascript" src="prefs.js"></script>
+<script type="text/javascript" src="info.js"></script>
<!-- <script type="text/javascript" src="myconsole.js"></script> -->
<script type="text/javascript" src="menu.js"></script>
<script type="text/javascript" src="ticker.js"></script>
var g_lang = "<? echo $G_lang; ?>";
var g_lng = "<? echo $G_lng; ?>";
var g_tables_n = <? echo TABLES_N; ?>;
+ var g_tables_appr_n = <? echo TABLES_APPR_N; ?>;
var g_tables_auth_n = <? echo TABLES_AUTH_N; ?>;
var g_tables_cert_n = <? echo TABLES_CERT_N; ?>;
var g_prefs, g_prefs_new = null;
<div id="xhrdeltalog"></div>
</div>
-<div id="info" class="notify" style="z-index: 200; width: 400px; margin-left: -200px; height: 340px; top: 150px; visibility: hidden;">
+<div id="info" class="notify" style="z-index: 200; width: 500px; margin-left: -250px; height: 340px; top: 150px; visibility: hidden;">
<table class="info">
-<tr><td class="le"><b><?php echo $mlang_room['info_login'][$G_lang]; ?></b></td><td class="ri"><span class="login_id"></span></td></tr>
-<tr><td class="le"><b><?php echo $mlang_room['info_state'][$G_lang]; ?></b></td><td class="ri"><span class="state_id"></span></td></tr>
-<tr><td class="le"><b><?php echo $mlang_room['info_guar'][$G_lang]; ?></b></td><td class="ri"><span class="guar_id"></span></td></tr>
-<tr><td class="le"><b><?php echo $mlang_room['info_match'][$G_lang]; ?></b></td><td class="ri"><span class="match_id"></span></td></tr>
-<tr><td class="le"><b><?php echo $mlang_room['info_game'][$G_lang]; ?></b></td><td class="ri"><span class="game_id"></span></td></tr>
-<tr><td colspan="2" style="background-color: pink;">di seguito le opzioni che verranno attivate successivamente:</td></tr>
-<tr><td class="le ri" colspan="2"><b><?php echo $mlang_room['info_frie'][$G_lang]; ?></b></td></tr>
-<tr><td class="le info-opt"><input type="radio" name="friend" class="friend_id" value="black">Da evitare</td>
- <td class="ri info-opt"><input type="radio" name="friend" class="friend_id" value="friend">Amico</td></tr>
-<tr><td class="le info-opt"><input type="radio" name="friend" class="friend_id" value="unknown">Sconosciuto</td>
-<td class="ri info-opt"><input type="radio" name="friend" class="friend_id" value="bff">Amico fidato</td></tr>
-<tr><td class="le info-opt"><input type="radio" name="friend" class="friend_id" value="test">In prova</td></tr>
-<tr><td class="le"><b>Bravura:</b></td><td class="le"><b>Credibilità:</b></td></tr>
-<tr><td class="info-opt">
+
+<tr>
+<td class="head"><span><?php echo $mlang_room['info_login'][$G_lang]; ?>:</span></td>
+<td class="ri b-right data"><span class="login_id"></span></td>
+<td class="head"><span><?php echo $mlang_room['info_status'][$G_lang]; ?>:</span></td>
+<td class="ri data"><span class="state_id"></span></td>
+</tr>
+
+<tr>
+<td class="head"><span><?php echo $mlang_room['info_guar'][$G_lang]; ?>:</span></td>
+<td class="ri b-right data"><span class="guar_id"></span></td>
+<td class="head"><span class="title" title="<?php echo $mlang_room['info_match_tit'][$G_lang]; ?>"><?php echo $mlang_room['info_match'][$G_lang]; ?>:</span></td>
+<td class="ri data"><span class="match_id"></span></td>
+</tr>
+
+<tr>
+<td class="head"><span class="title" title="<?php echo $mlang_room['info_party_tit'][$G_lang]; ?>"><?php echo $mlang_room['info_party'][$G_lang]; ?>:</span></td>
+<td class="ri b-right data"><span class="party_id"></span></td>
+<td class="head"><span class="title" title="<?php echo $mlang_room['info_game_tit'][$G_lang]; ?>"><?php echo $mlang_room['info_game'][$G_lang]; ?>:</span></td>
+<td class="ri data"><span class="game_id"></span></td>
+</tr>
+
+<tr class="widefriend_id">
+<td colspan="3" class="head"><span><?php echo $mlang_room['info_repfrie'][$G_lang]; ?>:</span></td>
+<td class="le data"><?php echo $mlang_room['info_skill'][$G_lang]; ?>: <span class="skill_id"></span></td>
+</tr>
+
+<tr class="widefriend_id"><td class="le info-opt data">Da evitare: <span class="black_id"></span></td>
+<td class="le info-opt data">In prova: <span class="test_id"></span></td>
+<td class="le info-opt data">Amico: <span class="friend_id"></span></td>
+<td class="le data">Fidato: <span class="bff_id"></span></td></tr>
+
+<tr class="narrowfriend_id">
+<td colspan="3" class="head"><span><?php echo $mlang_room['info_repbff'][$G_lang]; ?>:</span></td>
+<td class="le data"><?php echo $mlang_room['info_skill'][$G_lang]; ?>: <span class="skill_id"></span></td></tr>
+
+<tr class="narrowfriend_id"><td class="le info-opt data">Da evitare: <span class="black_id"></span></td>
+<td class="le info-opt data">In prova: <span class="test_id"></span></td>
+<td class="le info-opt data">Amico: <span class="friend_id"></span></td>
+<td class="le data">Fidato: <span class="bff_id"></span></td></tr>
+<tr><td class="le ri triple" colspan="3"><b><?php echo $mlang_room['info_frie'][$G_lang]; ?></b></td>
+<td class="le data triple"><input type="radio" name="friend" class="friend_id" value="black"
+ onclick="info_onlyifknown_isvisible();">Da evitare</td></tr>
+<tr>
+<td class="le info-opt data"><input type="radio" name="friend" class="friend_id" value="unknown"
+ onclick="info_onlyifknown_isvisible();">Sconosciuto</td>
+<td class="le info-opt data"><input type="radio" name="friend" class="friend_id" value="test"
+ onclick="info_onlyifknown_isvisible();">In prova</td>
+<td class="ri info-opt data"><input type="radio" name="friend" class="friend_id" value="friend"
+ onclick="info_onlyifknown_isvisible();">Amico</td>
+<td class="ri info-opt data"><input type="radio" name="friend" class="friend_id" value="bff"
+ onclick="info_onlyifknown_isvisible();">Amico fidato</td>
+</tr>
+<tr class="onlyifknown_gid">
+<td class="le head"><span><?php echo $mlang_room['info_skill'][$G_lang]; ?>:</span></td>
+<td class="data">
<table class="fiverank" style="margin: auto;">
<tr><td class="c1t">1</td>
<td class="c2t">2</td>
<td class="c5b"><input type="radio" name="skill" class="skill_id" value="5"></td>
</tr>
</table>
-</td><td class="info-opt">
+</td>
+<td class="le"><b>Credibilità:</b></td>
+<td class="data">
<table class="fiverank" style="margin: auto;">
<tr><td class="c1t">1</td>
<td class="c2t">2</td>
<td class="c3t">3</td>
<td class="c4t">4</td>
<td class="c5t">5</td></tr>
- <tr><td class="c1b"><input type="radio" name="credib" class="credib_id" value="1"></td>
- <td class="c2b"><input type="radio" name="credib" class="credib_id" value="2"></td>
- <td class="c3b"><input type="radio" name="credib" class="credib_id" value="3"></td>
- <td class="c4b"><input type="radio" name="credib" class="credib_id" value="4"></td>
- <td class="c5b"><input type="radio" name="credib" class="credib_id" value="5"></td>
+ <tr><td class="c1b"><input type="radio" name="trust" class="trust_id" value="1"></td>
+ <td class="c2b"><input type="radio" name="trust" class="trust_id" value="2"></td>
+ <td class="c3b"><input type="radio" name="trust" class="trust_id" value="3"></td>
+ <td class="c4b"><input type="radio" name="trust" class="trust_id" value="4"></td>
+ <td class="c5b"><input type="radio" name="trust" class="trust_id" value="5"></td>
</tr>
</table>
</td></tr>
</table>
<div style="position: absolute; bottom: 8px; margin: auto; width: 100%;">
<input type="submit" class="input_sub" style="bottom: 4px;" onclick="$('info').style.visibility = 'hidden';" value="<?php echo $mlang_room['btn_close'][$G_lang]; ?>"/>
-<!-- <input type="submit" class="input_sub" style="bottom: 4px;" onclick="prefs_reset();" value="<?php echo $mlang_room['btn_reset'][$G_lang]; ?>"/>
-<input type="submit" class="input_sub" style="bottom: 4px;" onclick="prefs_save();" value="<?php echo $mlang_room['btn_save'][$G_lang]; ?>"/> -->
+<input type="submit" class="input_sub" style="bottom: 4px;" onclick="info_reset();" value="<?php echo $mlang_room['btn_reset'][$G_lang]; ?>"/>
+<input type="submit" class="input_sub" style="bottom: 4px;" onclick="info_save();" value="<?php echo $mlang_room['btn_save'][$G_lang]; ?>"/>
</div>
</div>
'en' => 'To send a message to the administrator you have to be authenticated'),
'shutmsg' => array( 'it' => '<b>Il server sta per essere riavviato, non possono avere inizio nuove partite.</b>',
'en' => '<b>The server is going to be rebooted, new games are not allowed.</b>'),
+ 'mustappr' => array( 'it' => '<b>Il tavolo a cui volevi sederti richiede autentifica o apprendistato.</b>',
+ 'en' => '<b>The table where you want to sit require authentication or apprentice</b>'),
'mustauth' => array( 'it' => '<b>Il tavolo a cui volevi sederti richiede autentifica.</b>',
'en' => '<b>The table where you want to sit require authentication</b>'),
'mustcert' => array( 'it' => '<b>Il tavolo a cui volevi sederti richiede autentifica e certificazione.</b>',
Ciò è necessario per ottenere la password.<br><br>
Saluti e buone partite, mop.<br>',
'en' => 'EN mhtml [%s] [%s]'),
+ 'info_err' => array( 'it' => 'E\' occorso un errore (%d), riprova più tardi.',
+ 'en' => 'Some error occurs (%d), retry later.'),
+ 'info_auth' => array('it' => 'Non essendo autenticato non puoi costruire una rete di preferenze.',
+ 'en' => 'Some error occurs (%d), retry later.')
);
define('LICMGR_CHO_ACCEPT', 0);
echo show_notify(str_replace("\n", " ", placings_show(FALSE)), 0, $mlang_indwr['btn_close'][$G_lang], 800, 600);
}
- else if ($argz[0] == 'whysupport') {
- echo show_notify(str_replace("\n", " ", $G_room_whysupport[$G_lang]), 0, $mlang_indwr['btn_close'][$G_lng], 400, 200);
- }
else if ($argz[0] == 'apprentice') {
if (($cli_name = gpcs_var('cli_name', $get, $post, $cookie)) === FALSE)
$cli_name = "";
// check existence of username or email
$is_trans = FALSE;
do {
+ error_log($cli_name);
+ if (login_consistency($cli_name) == FALSE) {
+ $mesg_to_user = "Il nickname non è conforme alle regole per la sua costruzione.";
+ break;
+ }
+
if (($bdb = BriskDB::create()) == FALSE) {
$mesg_to_user = "Connessione al database fallita";
break;
if ($argz[0] == 'ping') {
log_wr("PING RECEIVED");
}
+ else if ($argz[0] == 'info') {
+ if ($user->is_auth()) {
+ if ($argz[1] == 'save') {
+ if (!isset($post['info'])) {
+ return FALSE;
+ }
+ if (($ret = $brisk->info_save($user, $post['info'])) == 0) {
+ echo "1";
+ return TRUE;
+ }
+
+ printf($mlang_indwr['info_err'][$G_lang], $ret);
+ return FALSE;
+ }
+ }
+ else {
+ printf($mlang_indwr['info_auth'][$G_lang]);
+ return FALSE;
+ }
+ }
else if ($argz[0] == 'prefs') {
if ($argz[1] == 'save') {
if (!isset($post['prefs'])) {
if (($wa_lock = Warrant::lock_data(TRUE)) != FALSE) {
if (($fp = @fopen(LEGAL_PATH."/warrant.txt", 'a')) != FALSE) {
/* Unix time | session | nickname | IP | where was | mesg */
- fwrite($fp, sprintf("%ld|%s|%s|%s|\n", $curtime, xcapelt($user->name), xcapelt(urldecode($cli_name)), xcapelt(urldecode($cli_email))));
+ fwrite($fp, sprintf("%ld|%s|%s|%s|\n", $curtime, xcapelt($user->name), xcapelt(trim(urldecode($cli_name))), xcapelt(trim(urldecode($cli_email)))));
fclose($fp);
}
Warrant::unlock_data($wa_lock);
if (($bdb = BriskDB::create()) == FALSE)
break;
- $cli_name = urldecode($cli_name);
- $cli_email = urldecode($cli_email);
+ $cli_name = trim(urldecode($cli_name));
+ $cli_email = trim(urldecode($cli_email));
// check for already used fields
if (($idret = $bdb->check_record_by_login_or_email($cli_name, $cli_email)) != 0) {
log_wr($user->comm[$user->step % COMM_N]);
$user->step_inc();
- }
- else if ($argz[0] == 'whysupport') {
- $user->comm[$user->step % COMM_N] = "gst.st = ".($user->step+1)."; ";
- $user->comm[$user->step % COMM_N] .= show_notify(str_replace("\n", " ", $G_room_whysupport[$G_lang]), 0, $mlang_indwr['btn_backtotab'][$G_lang], 400, 200);
-
- log_wr($user->comm[$user->step % COMM_N]);
- $user->step_inc();
-
}
else if ($argz[0] == 'chatt') {
- $brisk->chatt_send($user, xcapemesg($mesg));
+ $brisk->chatt_send($user, xcapemesg($mesg), $mlang_indwr);
}
else if ($argz[0] == 'tosmgr') {
// check IF is authnticated user, both terms of service versions matches
(!$user->is_auth() || $user->is_appr()) ) {
$not_allowed_msg = nickserv_msg($dt, $mlang_indwr['mustauth'][$G_lang]);
}
+ else if ( $table->auth_type == TABLE_AUTH_TY_APPR &&
+ (!$user->is_auth()) ) {
+ $not_allowed_msg = nickserv_msg($dt, $mlang_indwr['mustappr'][$G_lang]);
+ }
else if ($user->flags & USER_FLAG_TY_FIRONLY && $table->player_n > 0) {
$not_allowed_msg = nickserv_msg($dt, $mlang_indwr['mustfirst'][$G_lang]);
}
--- /dev/null
+/*
+ * brisk - info.js
+ *
+ * Copyright (C) 2015 Matteo Nastasi
+ * mailto: nastasi@alternativeoutput.it
+ * matteo.nastasi@milug.org
+ * web: http://www.alternativeoutput.it
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 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
+ * MERCHANTABLILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details. You should have received a
+ * copy of the GNU General Public License along with this program; if
+ * not, write to the Free Software Foundation, Inc, 59 Temple Place -
+ * Suite 330, Boston, MA 02111-1307, USA.
+ *
+ */
+
+var mlang_info = { 'btn_close' : { 'it' : 'Chiudi.',
+ 'en' : 'Close.' }
+ };
+
+
+function info_fld(dobj)
+{
+ var fields = { login: { type: 'value' },
+ state: { type: 'value', perms: 'ro' },
+ guar: { type: 'value', perms: 'ro' },
+
+ widefriend: { type: 'fields', fields: { skill: { type: 'value', perms: 'ro' },
+ black: { type: 'value', perms: 'ro' },
+ test: { type: 'value', perms: 'ro'},
+ friend: { type: 'value', perms: 'ro'},
+ bff: { type: 'value', perms: 'ro'}
+ } },
+ narrowfriend: { type: 'fields', fields: { skill: { type: 'value', perms: 'ro' },
+ black: { type: 'value', perms: 'ro'},
+ test: { type: 'value', perms: 'ro'},
+ friend: { type: 'value', perms: 'ro'},
+ bff: { type: 'value', perms: 'ro'}
+ } },
+ match: { type: 'value', perms: 'ro' },
+ game: { type: 'value', perms: 'ro' },
+ party: { type: 'value', perms: 'ro' },
+ friend: { type: 'radio' },
+ skill: { type: 'radio' },
+ trust: { type: 'radio' }
+ };
+
+ var ret = new Fieldify([dobj], fields);
+ return (ret);
+ }
+
+function info_show(username)
+{
+ var info_in_in = server_request('mesg', 'chatt|/info ' +
+ encodeURIComponent(username));
+ var info_in = JSON.parse(info_in_in);
+ var info = null;
+
+ if (info_in.ret == 0) {
+ info = info_fld($('info'));
+ info.json2dom(info_in);
+ info_onlyifknown_isvisible();
+ info.visible(true);
+ }
+ else {
+ var noti = new notify(gst, info_in.mesg, 0, mlang_info['btn_close'][g_lang], 400, 150);
+ }
+}
+
+var g__info_show_target = "";
+function info_show_cb(e)
+{
+ if (g__info_show_target == e.target.innerHTML) {
+ g__info_show_target = "";
+ info_show(e.target.innerHTML);
+ }
+ else {
+ g__info_show_target = e.target.innerHTML;
+ }
+}
+
+function info_reset()
+{
+ var ret, target;
+
+ target = $('info').getElementsByClassName('login_id')[0].innerHTML;
+ return info_show(target);
+}
+
+function info_save()
+{
+ var info, jinfo, ret;
+
+ info = info_fld($('info'));
+ jinfo = info.dom2json();
+
+ ret = server_request('mesg', 'info|save','__POST__', 'info', JSON.stringify(jinfo));
+
+ if (ret == 1) {
+ $('info').style.visibility = 'hidden';
+ }
+ else {
+ alert(ret);
+ }
+}
+function info_onlyifknown_isvisible()
+{
+ var vis = 'inherit';
+ var arr = fieldify_get_dom_element([$('info')], 'friend');
+ var obj = null;
+
+ for (var k = 0 ; k < arr.length ; k++) {
+ if (arr[k].checked == true) {
+ obj = arr[k];
+ break;
+ }
+ }
+ if (obj == null) {
+ return false;
+ }
+
+ if (obj.value == 'black' || obj.value == 'unknown') {
+ vis = 'hidden';
+ }
+ $('info').getElementsByClassName('onlyifknown_gid')[0].style.visibility = vis;
+ return true;
+}
$errcode = 0;
} while (FALSE);
if ($errcode) {
- singlemsg("E' occorso un errore durante la verifica della e-mail.",
- sprintf("E' occorso un errore durante la verifica della e-mail.<br><br>Codice d'errore: %d.<br>", $errcode));
+ if ($errcode == 10002) {
+ singlemsg("L'email è già stata verificata con successo.",
+ "L'email è già stata verificata con successo, ora attenda che le venga recapitata la password.");
+ }
+ else {
+ singlemsg("E' occorso un errore durante la verifica della e-mail.",
+ sprintf("E' occorso un errore durante la verifica della e-mail.<br><br>Codice d'errore: %d.<br>", $errcode));
+ }
$bdb->transaction('ROLLBACK');
}
}
ret = server_request('mesg', 'prefs|save','__POST__', 'prefs', JSON.stringify(g_prefs));
- if (ret == 1)
+ if (ret == 1) {
$('preferences').style.visibility = 'hidden';
+ }
+ else {
+ alert(ret);
+ }
}
function prefs_reset()
}
table.placing {
- background-image: url('img/najole_light.png');
+ background-image: url('img/najole_wh_light.png');
background-attachment: fixed;
border: 1px solid gray;
-moz-border-radius: 8px;
border-radius: 8px;
- background-image: url('img/najole_light.png');
+ background-image: url('img/najole_wh_light.png');
background-attachment: fixed;
width: 25%;
border-spacing: 0px;
padding: 0px;
- background-image: url('img/najole_light.png');
+ background-image: url('img/najole_wh_light.png');
background-attachment: fixed;
}
border: 1px solid gray;
margin-top: 8px;
- background-image: url('img/najole_light.png');
+ background-image: url('img/najole_wh_light.png');
background-attachment: fixed;
}
-moz-border-radius: 4px;
border-radius: 4px;
- background-image: url('img/najole_light.png');
+ background-image: url('img/najole_wh_light.png');
background-attachment: fixed;
}
table.info td {
border-top: 1px solid grey;
- padding: 4px;
- width: 50%;
+ padding: 6px;
+ width: 25%;
+}
+
+table.info td.triple {
+ border-top: 2px solid #000000;
+}
+
+table.info td.head span.title {
+ cursor: help;
+}
+
+table.info td.head span {
+ font-weight: bold;
}
+table.info td.data {
+ background-color: white;
+}
+table.info td.data span {
+ text-align: left;
+ font-style: italic;
+}
table.info table.fiverank {
border-collapse: collapse;
padding: 0px 4px 4px 4px;
}
+table.info td.b-right {
+ border-right: 1px solid grey;
+ }
+
table.info td.noborder {
border-top: 0px;
}
table.info td.le {
- padding-left: 16px;
+ padding-left: 8px;
}
table.info td.ro {
- padding-right: 16px;
+ padding-right: 8px;
}
body.explain h1 {
var usr = $("standup").getElementsByClassName("id_usr");
for (i = 0 ; i < usr.length ; i++) {
- addEvent(usr[i], "click", click_update_cb);
+ addEvent(usr[i], "click", info_show_cb);
}
}
act_logout(0);
};
-var g_user_info_target = "";
-
-function info_show(username)
-{
- // ret = server_request('mesg', 'prefs|save','__POST__', 'prefs', JSON.stringify(g_prefs));
- var info_in = JSON.parse(server_request('mesg', 'chatt|/info ' + username));
- var info = null;
-
- if (info_in.ret == 0) {
- var fields = { login: { type: 'value' },
- state: { type: 'value' },
- guar: { type: 'value' },
- match: { type: 'value' },
- game: { type: 'value' },
- friend: { type: 'radio' } };
-
- info = new Fieldify($('info'), fields);
- info.populate(info_in);
- info.visible(true);
- }
- else {
- console.log("some error: open a dialog");
- }
- // FIXME: just to be finished
- console.log(info);
-}
-
-function click_update_cb(e)
-{
- if (g_user_info_target == e.target.innerHTML) {
- g_user_info_target = "";
- info_show(e.target.innerHTML);
- }
- else {
- g_user_info_target = e.target.innerHTML;
- }
-}
-
function j_tab_cont(table_idx, data)
{
var i;
$("table"+table_idx).innerHTML = content;
var usr = $("table"+table_idx).getElementsByClassName("id_usr");
for (i = 0 ; i < usr.length ; i++) {
- addEvent(usr[i], "click", click_update_cb);
+ addEvent(usr[i], "click", info_show_cb);
}
}
// MLANG 1
$("table_act"+idx).innerHTML = '<input type="button" class="button" name="xhenter'+idx+'" value="'+(g_lang == 'en' ? "Sit down." : "Mi siedo.")+'" onclick="act_sitdown('+idx+');">';
}
+ else if (act == 'sitappr') {
+ // MLANG 1
+ $("table_act"+idx).innerHTML = '<input type="button" style="background-repeat: no-repeat; background-position: center; background-image: url(\'img/okappr.png\');" class="button" name="xhenter'+idx+'" value="'+(g_lang == 'en' ? "Sit down." : "Mi siedo.")+'" onclick="act_sitdown('+idx+');" title="'+(g_lang == 'en' ? "reserved table for authenticated and apprentice users only" : "tavolo riservato agli utenti registrati e agli apprendisti")+'" alt="'+(g_lang == 'en' ? "reserved table for authenticated and apprentice users only" : "tavolo riservato agli utenti registrati e agli apprendisti")+'">';
+ }
else if (act == 'sitreser') {
// MLANG 1
$("table_act"+idx).innerHTML = '<input type="button" style="background-repeat: no-repeat; background-position: center; background-image: url(\'img/okauth.png\');" class="button" name="xhenter'+idx+'" value="'+(g_lang == 'en' ? "Sit down." : "Mi siedo.")+'" onclick="act_sitdown('+idx+');" title="'+(g_lang == 'en' ? "reserved table for authenticated users only" : "tavolo riservato agli utenti registrati")+'" alt="'+(g_lang == 'en' ? "reserved table for authenticated users only" : "tavolo riservato agli utenti registrati")+'">';
(login[i] >= 'A' && login[i] <= 'Z')) {
if (old_c != login[i]) {
old_c = login[i];
- old_ct = 0;
+ old_ct = 1;
}
else {
- if (old_ct > 3) {
+ if (old_ct > 2) {
// FIXME LANG
- ret.ret = (g_lang == 'en' ? "More than three contiguous '" + old_c + "' not allowed." :
- "Il nickname contiene più di tre caratteri '" + old_c + "' consecutivi.");
+ ret.ret = (g_lang == 'en' ? "More than two contiguous '" + old_c + "' not allowed." :
+ "Il nickname contiene più di 2 caratteri '" + old_c + "' consecutivi.");
return (false);
}
}
}
$usr_n = pg_numrows($usr_pg);
- $tab_lines = "<tr><th></th><th>User</th><th>Guar</th><th>Apprendice</th><th>Date</th></tr>";
+ $tab_lines = "<tr><th></th><th>User</th><th>EMail</th><th>Guar</th><th>Apprendice</th><th>Date</th></tr>";
for ($i = 0 ; $i < $usr_n ; $i++) {
$usr_obj = pg_fetch_object($usr_pg, $i);
- $tab_lines .= sprintf("<tr><td><input name=\"f_newuser%d\" type=\"checkbox\" %s></td><td>%s</td><td>%s</td><td>%s</td><td>%s</td></tr>\n",
+ $tab_lines .= sprintf("<tr><td><input name=\"f_newuser%d\" type=\"checkbox\" %s></td><td>%s</td><td>%s</td><td>%s</td><td>%s</td><td>%s</td></tr>\n",
$usr_obj->code, ($nocheck ? "" : "CHECKED"),
- eschtml($usr_obj->login), eschtml($usr_obj->guar_login),
+ eschtml($usr_obj->login), eschtml($usr_obj->email), eschtml($usr_obj->guar_login),
($usr_obj->type & USER_FLAG_TY_APPR ? "Yes" : "No"),
$usr_obj->lintm);
}