Skocz do zawartości
"Idzie nowe..." - o zmianach i nie tylko ×
Przeniesienie zakupów z IPS Marketplace / Moving bought items from IPS Marketplace ×

Rekomendowane odpowiedzi

Opublikowano

Zmotywowany tym tematem piszę w nadziei, że ktoś pomoże :a:

Otóż problem jest taki, że po pierwsze nie mam w zasadzie żadnego pojęcia o "kodzeniu" czy "modzeniu", a działam metodą ruskiego profesora Porównajewa - tu podpatrzę, tam pogrzebię i czasem coś mi się uda :a:

Ale do rzeczy:

Flashchat ma moduły integracji z niemal wszystkimi CMS-ami i skryptami for jakie są używane w necie (ostatnia wersja ma zdaje się 75 modułów integracji) w tym do naszego ulubionego skryptu, czyli IP.BOARD. Od wersji 1.x do 3.x

I to działa - wystarczy przy instalacji zaznaczyć z czym chcemy integrować i tyle roboty. Loginy i hasła wchodzą pięknie.

Kiedy używaliśmy wersji czata 4.7.x. i forum 2.3.4 po kliknięciu na dorobiony w menu forum link do czata automatycznie logowało na czat.

Ale... problem jest z uprawnieniami. Domyślnie w czacie jest 4 grupy userów:

Admin - i tu przyporządkowuje z forum userów z grupy admin i supermodów

Moderator - moderatorów z forum

User - całą resztę zarejestrowanych na forum

Nobody - i tu do IPB nikogo nie przyporządkowuje

I w tym jest ten "myk" bo nie chcemy, żeby na czata mogli się logować userzy z grup zbanowany, zarejestrowany czy zawieszony, a domyślnie tak się dzieje i zbanowane trolle włażą na czata.

Kiedyś na forum Flashchata ktoś dał rozwiązanie do wersji 6.x czata i 2.3.4 IP.Board i od biedy działało - z tym, że nie zabraniało dostępu zawieszonym.

Przesiedziałem parę godzin i udało mi się przerobić to tak, że wpuszcza tylko ustawione w pliku grupy, ale też wpuszcza zawieszonych - i tu sam się zawiesiłem :a:

Drugim, mniejszym problemem jest to, że czat pokazuje userów z ich loginem, a nie nazwą wyświetlaną, ale to mniej uciążliwe - kiedyś zgrzebałem pliki do wersji forum 2.3.x., teraz jeszcze nie doszedłem gdzie to siedzi :) (może ktoś i na to zerknąć?)

Moim zdaniem jeśli ktoś chce mieć czat na forum czy gdziekolwiek warto się tym skryptem zainteresować, bo kosztuje symboliczne 5$ z dożywotnim upgreadem (sic!) a możliwościami przerasta wszystkie czaty proponowane przez IPS.

Teraz trochę kodu (cały plik integracji z IPB3):

<?php

/************************************************************************/

//!!! IMPORTANT NOTE

//!!! FlashChat 4.4.0 and higher support a new user role: ROLE_MODERATOR

//!!! Please edit the getUser and getRoles function if you need use of

//!!! the new moderator role. This change has not yet been applied.

/************************************************************************/

// integration class for Invision Power Board (www.invisionboard.com)

$curdir = getcwd();

$ipb_root_path = realpath(dirname(__FILE__) . '/../../../') . '/';

chdir($ipb_root_path);

require_once($ipb_root_path . 'conf_global.php');

chdir($curdir);

class IPBCMS {

var $userid;

var $loginStmt;

var $getUserStmt;

var $getUsersStmt;

function IPBCMS() {

$this->loginStmt = new Statement("SELECT m.member_id, m.name AS login, m.ip_address as ip_address, m.member_group_id as mgroup from ".$GLOBALS["INFO"]["sql_tbl_prefix"]."members as m WHERE LOWER(m.name)=? AND m.members_pass_hash = MD5(CONCAT(MD5(m.members_pass_salt),MD5(?))) AND member_group_id IN (4,3) LIMIT 1");

$this->getUserIdStmt = new Statement("SELECT *

FROM ".$GLOBALS["INFO"]["sql_tbl_prefix"]."sessions

WHERE id=?") ;

$this->getUserStmt = new Statement("SELECT member_id, name AS login, g.g_is_supmod AS is_admin, g.g_open_close_posts AS is_moderator FROM ".$GLOBALS["INFO"]["sql_tbl_prefix"]."members AS m INNER JOIN ".$GLOBALS["INFO"]["sql_tbl_prefix"]."groups AS g ON m.member_group_id = g.g_id WHERE member_id=? AND member_group_id IN (4,3) LIMIT 1");

$this->getUsersStmt = new Statement("SELECT member_id, name as login FROM ".$GLOBALS["INFO"]["sql_tbl_prefix"]."members WHERE member_group_id IN (4,3)");

$this->userid = NULL;

if (isset($_COOKIE['session_id'])) {

$rs = $this->getUserIdStmt->process($_COOKIE['session_id']);

if($rs && ($rec = $rs->next())) {

$this->userid = $rec['member_id'];

}

}

}

function isLoggedIn() {

return $this->userid;

}

function getRoles($group) {

$rv = NULL;

if ($group == 1)

$rv = ROLE_ADMIN;

elseif ( $group == 2 )

$rv = ROLE_MODERATOR;

elseif ($GLOBALS['fc_config']['liveSupportMode'])

$rv = ROLE_CUSTOMER;

else

$rv = ROLE_USER;

return $rv;

}

function getUserProfile($userid) {

if ($userid == SPY_USERID) $rv = NULL;

elseif ($user = $this->getUser($userid)) {

$rv = ($id = $this->isLoggedIn() && ($id == $userid)) ? $GLOBALS["INFO"]["board_url"] . "/index.php?act=UserCP&CODE=01" : $GLOBALS["INFO"]["board_url"]."/index.php?showuser={$user[id]}";

}

return $rv;

}

function getUser($userid) {

$rv = NULL;

if(($rs = $this->getUserStmt->process($userid)) && ($rec = $rs->next())) {

if ( $rec['is_admin'] == 1 )

$level = 1;

elseif ( $rec['is_moderator'] == 1 )

$level = 2;

else

$level = 0;

$rec['roles'] = $this->getRoles($level);

$rv = $rec;

}

return $rv;

}

function login($u_login, $u_password) {

// taken from IPB's Login::do_login function

if (($rs = $this->loginStmt->process(stripslashes(str_replace("'", "'", $u_login)), $u_password)) && ($rec = $rs->next())) {

// statements used by IPBCMS::login()

$this->updateIPStmt = new Statement("UPDATE ".$GLOBALS["INFO"]["sql_tbl_prefix"]."members SET ip_address=? WHERE id=? member_group_id IN (4,3)");

$this->deleteSessionStmt = new Statement("DELETE FROM ".$GLOBALS["INFO"]["sql_tbl_prefix"]."sessions WHERE ip_address=? AND id <> ?");

$this->updateSessionStmt = new Statement("UPDATE ".$GLOBALS["INFO"]["sql_tbl_prefix"]."sessions SET member_name=?, member_id=?, running_time=?, member_group=?, login_type=? WHERE id=? member_group_id IN (4,3)");

$this->deleteSessionIPStmt = new Statement("DELETE FROM ".$GLOBALS["INFO"]["sql_tbl_prefix"]."sessions WHERE ip_address=?");

$this->insertSessionStmt = new Statement("INSERT INTO ".$GLOBALS["INFO"]["sql_tbl_prefix"]."sessions (id, member_name, member_id, running_time, member_group, ip_address, browser, login_type) VALUES (?,?,?,?,?,?,?,?)");

$this->userid = $rec['member_id'];

$GLOBALS['INFO']['cookie_domain'] = $GLOBALS['INFO']['cookie_domain'] == "" ? "" : $GLOBALS['INFO']['cookie_domain'];

$GLOBALS['INFO']['cookie_path'] = $GLOBALS['INFO']['cookie_path'] == "" ? "/" : $GLOBALS['INFO']['cookie_path'];

@setcookie("member_id", $rec['member_id'], 0, $GLOBALS['INFO']['cookie_path'], $GLOBALS['INFO']['cookie_domain']);

@setcookie("pass_hash", $rec[password], 0, $GLOBALS['INFO']['cookie_path'], $GLOBALS['INFO']['cookie_domain']);

// update profile if IP address missing

if ($rec[ip_address] == "" || $rec[ip_address] == '127.0.0.1') {

$this->updateIPStmt->process($_SERVER[REMOTE_ADDR], $rec['member_id']);

}

// create or update session

$poss_session_id = isset($_COOKIE[$GLOBALS[iNFO][cookie_id]."session_id"]) ? urldecode($_COOKIE[$GLOBALS[iNFO][cookie_id]."session_id"]) : FALSE;

if ($poss_session_id) {

// delete any old session with this ipadd that doesn't match our session id

$this->deleteSessionStmt->process($_SERVER[REMOTE_ADDR], $poss_session_id);

$this->updateSessionStmt->process($rec[login], $rec['member_id'], time(), $rec[mgroup], 0, $poss_session_id);

}

else {

$session_id = md5(uniqid(microtime()));

// delete any old sessions with this users ip

$this->deleteSessionIPStmt->process($_SERVER[REMOTE_ADDR]);

$this->insertSessionStmt->process($session_id, $rec[login], $rec['member_id'], time(), $rec[mgroup], $_SERVER[REMOTE_ADDR], substr($HTTP_USER_AGENT,0,50), 0);

}

return $rec['member_id'];

}

}

function userInRole($userid, $role) {

if($user = $this->getUser($userid)) {

return ($user['roles'] == $role);

}

return false;

}

function logout() {

}

function getUsers() {

$rv = $this->getUsersStmt->process();

return $rv;

}

function getGender($userid){

// 'M' for Male, 'F' for Female, NULL for undefined

return NULL;

}

}

$GLOBALS['fc_config']['db'] = array(

'host' => $INFO['sql_host'],

'user' => $INFO['sql_user'],

'pass' => $INFO['sql_pass'],

'base' => $INFO['sql_database'],

'pref' => $INFO['sql_tbl_prefix']."fc_",

);

$GLOBALS['fc_config']['cms'] = new IPBCMS();

foreach($GLOBALS['fc_config']['languages'] as $k => $v) {

$GLOBALS['fc_config']['languages'][$k]['dialog']['login']['moderator'] = '';

}

?>

Na czerwono zaznaczone jest to co dodałem. Przyznaję bez bicia - nie do końca wiem co zrobiłem, ale działa ;) - w tym przykładzie wpuszcza na czat tylko userów z grup nr 3 i 4

Reasumując ten przydługi wywód - chodzi o to, żeby była możliwość blokowania dostępu określonym grupom userów, a także by czat nie wpuszczał zawieszonych, zbanowanych i oznaczonych jako spamerzy.

No i gdyby ktoś wiedział jak zrobić, żeby czat wyświetlał "display name" zamiast "login name" bylibyśmy wdzięczni dozgonnie.

p.s. mam nadzieję, że mnie DawPi nie zastrzeli za takiego tasiemca, w dodatku z kodem wklejonym w quote, ale głupio przyznać, nie wiem jak pokolorować kawałki kodu w "code"

  • Manager
Opublikowano

Bo w code się nie da kolorować. Zróbmy to etapami.

Najpierw login na nazwę wyświetlaną:

zamień wszystkie:

m.name AS login

Na:

m.members_display_name AS login

Zapisz i sprawdź.

Jak pyknie, to jedziemy dalej.

intermedia - profesjonalne rozwiązania Invision Power Board

---

Chcesz uzyskać szybko i sprawnie pomoc? Uzupełnij wersję i adres w profilu.

Opublikowano

Mam, zmieniłem name na members_display_name - wyświetla wyświetlaną.

function IPBCMS() {

$this->loginStmt = new Statement("SELECT m.member_id, m.name AS login, m.ip_address as ip_address, m.member_group_id as mgroup from ".$GLOBALS["INFO"]["sql_tbl_prefix"]."members as m WHERE LOWER(m.name)=? AND m.members_pass_hash = MD5(CONCAT(MD5(m.members_pass_salt),MD5(?))) AND member_group_id IN (4,3) LIMIT 1");

$this->getUserIdStmt = new Statement("SELECT *

FROM ".$GLOBALS["INFO"]["sql_tbl_prefix"]."sessions

WHERE id=?") ;

$this->getUserStmt = new Statement("SELECT member_id, members_display_name AS login, g.g_is_supmod AS is_admin, g.g_open_close_posts AS is_moderator FROM ".$GLOBALS["INFO"]["sql_tbl_prefix"]."members AS m INNER JOIN ".$GLOBALS["INFO"]["sql_tbl_prefix"]."groups AS g ON m.member_group_id = g.g_id WHERE member_id=? AND member_group_id IN (4,3) LIMIT 1");

  • Manager
Opublikowano

Banned należy sprawdzić po wykonaniu zapytania -> if id grupy == banned to exit.

Suspended to będzie myślę nowe pole w tabeli members - restrict_post które to również musisz pobrać i potem sprawdzić ifem, czy coś zawiera.

Generalnie nie preferuję takiego 'kodzenia' bez możliwości testów, więc powinieneś zrobić to na swoim podwórku. :)

intermedia - profesjonalne rozwiązania Invision Power Board

---

Chcesz uzyskać szybko i sprawnie pomoc? Uzupełnij wersję i adres w profilu.

Jeśli chcesz dodać odpowiedź, zaloguj się lub zarejestruj nowe konto

Jedynie zarejestrowani użytkownicy mogą komentować zawartość tej strony.

Zarejestruj nowe konto

Załóż nowe konto. To bardzo proste!

Zarejestruj się

Zaloguj się

Posiadasz już konto? Zaloguj się poniżej.

Zaloguj się
  • Ostatnio przeglądający   0 użytkowników

    • Brak zarejestrowanych użytkowników przeglądających tę stronę.
×
×
  • Dodaj nową pozycję...

Powiadomienie o plikach cookie

Umieściliśmy na Twoim urządzeniu pliki cookie, aby pomóc Ci usprawnić przeglądanie strony. Możesz dostosować ustawienia plików cookie, w przeciwnym wypadku zakładamy, że wyrażasz na to zgodę.