psyface - Webinterface für psybnc - Entwicklungsvorschläge

Hilfestellungen zur Installation, Konfiguration und Inbetriebnahme eines Bouncers.. psybnc, bnc, muh, ezbounce, etc...
Peter Hansen
RE: RE:

Beitrag von Peter Hansen » 17. Aug 2004, 11:43

Hallo,
ich kann deinen Satndpunkt durchaus verstehen, doch meinst du ehrlich das ich jetzt so einfach den Connect auf den psyBNC hier poste? Ich will doch auch mein Taschengeld damit verdienen, und ich glaube das geht super damit ;) Aber ich kann dir ja nen ganz kleinen TIP geben ;)
Also, wie Hendrik schon sagte, musste die verbindung zum psyBNC erstmal schließen bevor du die Ausgabe auslesen kannst, sonst kann man halt beobachten das der "hängt". Außerdem stimmen da noch ein paar Sachen nicht ganz, aber darauf will ich jetzt nicht näher eingehen :P
MFG
Peter Hansen

Benutzeravatar
Micki
Newbie
Beiträge:20
Registriert:27. Jul 2004, 16:53

Beitrag von Micki » 17. Aug 2004, 11:56

hehe ok die idee reicht mir schon - dank dir.

ps: dein interface sieht gar net schlecht aus - kann man so schon benutzen

ps²: ich weiss, dass meins noch fehler hat, hatte genervt die lust verloren.

werd nachher noch nen bissl probieren

Benutzeravatar
Micki
Newbie
Beiträge:20
Registriert:27. Jul 2004, 16:53

Beitrag von Micki » 19. Aug 2004, 09:47

so jetzt kann ichs auch endlich mal auch sagen: danke

meins funktioniert jetzt auch - baue es grade in klassen um
wenn ich ne demo online hab, zeig ich sie dann auch ma

kosy

Beitrag von kosy » 20. Aug 2004, 01:00

hi, hab da mal ne klasse mit einigen nützlichen Funktionen gebastelt, vielleicht hilfts dem einen oder anderen, ist alles recht selbsterklärend:

Code: Alles auswählen

<?php

class psybnc {
		var $fp = false;
		var $server_ip;
		var $server_port;
		var $admin_ident;
		var $admin_nick;
		var $admin_pass;

		var $get_string;

		var $send_user;
		var $send_pw;
		var $send_vhost;
		var $send_leavemsg;
		var $send_addserver;
		var $send_delserver;
		var $send_channel;
		var $send_msg;


	#########################
	# CONNECTEN + EINLOGGEN #
	#########################
	function connect($server_ip, $server_port, $admin_ident, $admin_nick, $admin_pass) {

        $this->fp 		= fsockopen($server_ip, $server_port);
        $this->server_ip	= $server_ip;
        $this->server_port	= $server_port;
        $this->admin_ident	= $admin_ident;
        $this->admin_nick	= $admin_nick;
        $this->admin_pass	= $admin_pass;

		if(!$this->fp) {
			die ("Connection Fehler");
		}else{
			fputs($this->fp,"user $admin_ident $admin_ident $admin_ident@ :$admin_nick\r\n");
			fputs($this->fp,"nick $admin_nick\r\n");
			fputs($this->fp,"pass $admin_pass\r\n");
		}

	#set_time_limit(10);
	}


	######################
	# CONNECTION BEENDEN #
	######################
	function close() {
		fputs($this->fp, "QUIT\r\n");
		fclose($this->fp);
	} 


	##################
	# DATEN AUSLESEN #
	##################
	function rData() {
		$this->get_string	= "";

		while($get_data = fgets($this->fp, 512)) {
		$cmd_temp = explode(" ",$get_data);

			if(sizeof($cmd_temp)>3) {
			$cmd_type=$cmd_temp[1];

				if($cmd_type == "PRIVMSG") {
				$temp_string = strstr($get_data, $this->admin_ident." :");
				$temp_string = substr( strstr($temp_string, ":") , 1);
				$this->get_string = $this->get_string."<br>".$temp_string;
				}
			}
		}
	}


	######################
	# ALLE USER AUSLESEN #
	######################
	function BWHO() {
	fputs($this->fp, "BWHO \r\n");
	}

	##############
	# USER ADDEN #
	##############
	function cmd_adduser($send_user) {
		$this->send_user = $send_user;
        	fputs($this->fp, "adduser $send_user :$send_user\r\n"); 
	} 

	################
	# USER LÖSCHEN #
	################
	function cmd_deluser($send_user) {
		$this->send_user = $send_user;
        	fputs($this->fp, "deluser $send_user\r\n"); 
	} 

	###################################
	# ADMIN / EIGENES PASSWORT ÄNDERN #
	###################################
	function cmd_changepw($send_pw) {
		$this->send_pw = $send_pw;
		fputs($this->fp, "password $send_pw\r\n"); 
	} 

	########################
	# USER PASSWORT ÄNDERN #
	########################
	function cmd_changepw_user($send_user, $send_pw) {
		$this->send_user = $send_user;
		$this->send_pw = $send_pw;
		fputs($this->fp, "password $send_user:$send_pw\r\n"); 
	}

	######################
	# ADMIN STATUS GEBEN #
	######################
	function cmd_makeadmin($send_user) {
		$this->send_user = $send_user;
		fputs($this->fp, "madmin $send_user :$send_user\r\n");
	}

	##########################
	# ADMIN STATUS WEGNEHMEN #
	##########################
	function cmd_makeuser($send_user) {
		$this->send_user = $send_user;
		fputs($this->fp, "unadmin $send_user\r\n");
	}

	###################
	# VHOST FESTLEGEN #
	###################
	function cmd_vhost($send_vhost) {
		$this->send_vhost = $send_vhost;
		fputs($this->fp, "bvhost $send_vhost\r\n");
	}

	################
	# server adden #
	################
	function cmd_addserver($send_addserver) {
		$this->send_addserver = $send_addserver;
		fputs($this->fp, "addserver $send_addserver\r\n");
	}

	##################
	# server löschen #
	##################
	function cmd_delserver($send_delserver) {
		$this->send_delserver = $send_delserver;
		fputs($this->fp, "delserver $send_delserver\r\n");
	}

	#######################
	# LEAVE MSG FESTLEGEN #
	#######################
	function cmd_leavemsg($send_leavemsg) {
		$this->send_leavemsg = $send_leavemsg;
		fputs($this->fp, "leavemsg $send_leavemsg\r\n");
	}

	#################
	# /JOIN CHANNEL #
	#################
	function cmd_join($send_channel) {
		$this->send_channel = $send_channel;
		fputs($this->fp, "join $send_channel\r\n");
	}


	#######################
	# /JOIN AND SAY HELLO #
	#######################
	function cmd_joinhello($send_channel, $send_msg) {
		$this->send_channel = $send_channel;
		fputs($this->fp, "join $send_channel\r\n");
		fputs($this->fp, "PRIVMSG $send_channel :$send_msg\r\n");
	}

	##################
	# /LEAVE CHANNEL #
	##################
	function cmd_leave($send_channel) {
		$this->send_channel = $send_channel;
		fputs($this->fp, "part $send_channel\r\n");
	}

	###################
	# /PLAYPRIVATELOG #
	###################
	function cmd_playprivatelog() {
		fputs($this->fp, "PLAYPRIVATELOG\r\n");
	}

	####################
	# /ERASEPRIVATELOG #
	####################
	function cmd_eraseprivatelog() {
		fputs($this->fp, "ERASEPRIVATELOG\r\n");
	}

}
?>
Beispiel für user/bnc adden:

Code: Alles auswählen

$bnc = new psybnc();
$bnc->connect("127.0.0.1","40000","root","root","passwort");
$bnc->cmd_adduser("peter");
$bnc->cmd_changepw_user("peter", "peterpass");
$bnc->close();
Wenn man spassig ist, kann man auch noch die antwort abfangen:

Code: Alles auswählen

$bnc->rData();
echo $bnc->get_string;
Oder den bnc einen Channel joinen und Hallo sagen lassen:

Code: Alles auswählen

$bnc->cmd_joinhello("#channel", "hallo und bis später, euer peter");
$bnc->cmd_leave("#channel");

Vielleicht hilfts euch ja, habt Spass :)


kosy - www.adnix.de - www.xp-optimizer.de

Hendrik
Chef
Beiträge:2076
Registriert:2. Sep 2003, 16:43
Wohnort:Berlin
Kontaktdaten:

Beitrag von Hendrik » 20. Aug 2004, 01:13

You rule man!

Is das ding tested & stable? ;-)

-Hendrik-
Einmal lesen, für immer glücklich: Hinweise zum Forum
--
Programming is similar to sex. If you make a mistake, you have to support it for the rest of your life.

kosy

Beitrag von kosy » 20. Aug 2004, 01:48

meinste jetzt mich? :)

Also ich hab die ganzen Funktionen alle mit Erfolg probiert. Allerdings ist das natürlich nur so eine Grundausstattung an Werkzeugen.
Dinge wie gejointe channel anzeigen lassen gehen damit leider nicht :/

Lustigerweise kenne ich mich mit bncs noch garnicht so richtig aus, daher kann ich garnicht mit Gewissheit sagen ob das alle Optionen sind, die sich über eine socket connection auf den bnc so easy umsetzen lassen.

Ich habe in dem Script allerdings auch noch dieses Problem mit dem Timeout, welches Miki schon beschrieben hat. Vielleicht mag der Miki uns ja helfen :P

kosy

Beitrag von kosy » 20. Aug 2004, 01:54

hab noch was vergessen:

Starten und Stoppen des psyBNC wird wohl nur über eine shell funktionieren, oder? Sprich: SSH Connection.
Aber mit php eine SSH-Connection aufzubaun hatte ich irgendwann mal verzwifelt und erfolglos versucht. Mit Perl ist das hingegen recht einfach.

Gibt es andere Möglichkeiten den psyBNC zu stoppen / starten ?!?

Gruß, kosy

Hendrik
Chef
Beiträge:2076
Registriert:2. Sep 2003, 16:43
Wohnort:Berlin
Kontaktdaten:

Beitrag von Hendrik » 20. Aug 2004, 02:05

Zur not machen wir einfach ein exec("ssh -c ...") oder sowas.. quick&dirty ;-)

channels auslesen ... *denkz* wüsst ich nich wie das jetzt geht, klappt wohl nur durch das auslesen der psybnc.conf an sich... mal gucken

-Hendrik-
Einmal lesen, für immer glücklich: Hinweise zum Forum
--
Programming is similar to sex. If you make a mistake, you have to support it for the rest of your life.

koskid
Newbie
Beiträge:12
Registriert:20. Aug 2004, 01:55
Kontaktdaten:

Beitrag von koskid » 20. Aug 2004, 02:09

koskid = kosy (ich hab mich mal registriert :roll: )

ja aber für ein exec musst du das php script ja auf dem server laufen lassen wo auch der psybnc installiert ist.
Ist sicherlich für kleine firmen kein problem, aber ein script das von überall aus läuft ist irgendwie attraktiver.

Peter Hansen: wenn die demo alle funktionen zeigt, die das interface hat, dann schämt euch sowas für 70 Euro anzubieten.
Für solch ein Script kann man doch kein Geld verlangen, allerhöchstens Spenden. psyBNC neustarten/stoppen, user adden/löschen/pw ändern...wenn das alle Funktionen sind...dann ist es wirklich peinlich soviel Geld dafür zu verlangen. Wenn ich mich da verschaut habe dann tuts mir leid, ansonsten stehe ich weiterhin zu dem was ich gesagt habe!
www.xp-optimizer.de - www.adnix.de - life is a debugger

Hendrik
Chef
Beiträge:2076
Registriert:2. Sep 2003, 16:43
Wohnort:Berlin
Kontaktdaten:

Beitrag von Hendrik » 20. Aug 2004, 04:06

Nun,

Koskid, deine Leistung ist anzuerkennen, keine Frage. Jedoch muss ich jetzt Peter mal in Schutz nehmen, es ist seine Sache, für wieviel Geld er seine Produkte verkauft. Der Preis regelt den Absatz, das wird er wissen. Und wenn man "fast" Monopolist ist, kann man seine Preise eh selbstbestimmen... Du hast dich doch bestimmt auch schonmal gefragt, warum ein Windows €199 kostet.. ;-)

-Hendrik-
Einmal lesen, für immer glücklich: Hinweise zum Forum
--
Programming is similar to sex. If you make a mistake, you have to support it for the rest of your life.

koskid
Newbie
Beiträge:12
Registriert:20. Aug 2004, 01:55
Kontaktdaten:

Beitrag von koskid » 20. Aug 2004, 12:13

^^ jojo, aber er ist sicher kein monopolist, wohl eher ein polypolist :P
Es gibt doch genug leute im Internet die derartige Scripts programmieren, oder nicht?!? ...Aber lass uns das Thema lieber nicht in diesem Topic diskutieren, wäre zu Schade das Ziel aus den Augen zu verlieren :)

Also würde ich das Timeout des Scriptes umgehen, wenn ich die Funktion so umschreibe:

Code: Alles auswählen

	##################
	# DATEN AUSLESEN #
	##################
	function rData() {
		$this->get_string	= "";
		fputs($this->fp, "QUIT\r\n"); #<-- entscheidend

		while(!feof($fp)) {
		$get_data = fgets($this->fp, 512); #<-- oder mehr
		$cmd_temp = explode(" ",$get_data);

			if(sizeof($cmd_temp)>3) {
			$cmd_type=$cmd_temp[1];

				if($cmd_type == "PRIVMSG") {
				$temp_string = strstr($get_data, $this->admin_ident." :");
				$temp_string = substr( strstr($temp_string, ":") , 1);
				$this->get_string = $this->get_string."<br>".$temp_string;
				}
			}
		}
	}
www.xp-optimizer.de - www.adnix.de - life is a debugger

koskid
Newbie
Beiträge:12
Registriert:20. Aug 2004, 01:55
Kontaktdaten:

BNC Status und Details abfragen

Beitrag von koskid » 20. Aug 2004, 13:53

Ich hab nochmal ne Funktion zum Auslesen des Online-/Offline-Status und des aktuellen Nicks/Hosts geschrieben.
Können fehler drinne sein, habs noch nicht getestet:

Code: Alles auswählen

class psybnc {
		......

		var $get_status;
		var $get_nick;
		var $get_host;

		............


	##################################
	# User/BNC Status/Daten auslesen #
	##################################
	function bncDetails($send_user) {
		$this->send_user 	= $send_user;
		$this->get_string	= "";
		$this->get_status	= "offline";
		$this->get_nick		= "";
		$this->get_host		= "";

		fputs($this->fp, "BWHO \r\n");
		fputs($this->fp, "QUIT\r\n");

		while(!feof($fp)) {
		$get_data = fgets($this->fp, 512);
		$cmd_temp = explode(" ",$get_data);

			if(sizeof($cmd_temp)>3) {
			$cmd_type=$cmd_temp[1];

				if(($cmd_type == "PRIVMSG") && (strstr($get_data, "[:") == TRUE)) {
				$userstring = strstr($get_data, $this->admin_ident." :");
				$userstring = substr( strstr($userstring, ":") , 1);

				################
				# Ident suchen #
				################
				$tempstr = substr($userstring, 2, strlen($userstring));
				$POS = strpos($tempstr, "(");
				$tempstr = substr($tempstr, 0, $POS);
				$current_ident = $tempstr;

					if($current_ident == $send_user) {

						#####################
						# Status überprüfen #
						#####################
						if($userstring[0] == "*") {
				 		$this->get_status = "online";
						} else {
				 		$this->get_status = "offline";
						}

						###########################
						# Aktuellen Nick auslesen #
						###########################
						$POS1 = strpos($userstring, "(")+1;
						$POS2 = strpos($userstring, ")");
						$tempstr = substr($userstring, $POS1, $POS2-$POS1);
						$this->get_nick = $tempstr;

						#################
						# Host auslesen #
						#################
						$tempstr = strstr($userstring, "@");
						$POS2 = strpos($tempstr, " ");
						$tempstr = substr($tempstr, 0, $POS2);
						$this->get_host = $tempstr;
					}
				}
			}
		}
	}

	................

Dabei gehe ich von der folgenden Syntax aus, die der Befehl /BWHO liefert:

online user syntax:
-------------------
* ident(aktueller nick)@host [: server] :name

offline user syntax:
--------------------
ident(aktueller nick)@host [: server] :name [zuletzt: letzter login ]


Ist doch schonmal was, oder?!? :roll:
www.xp-optimizer.de - www.adnix.de - life is a debugger

Benutzeravatar
Micki
Newbie
Beiträge:20
Registriert:27. Jul 2004, 16:53

Beitrag von Micki » 20. Aug 2004, 14:21

koskid eine frage:

also ich will nen useraddenbutton machen, bei dem man gleich nen wunschpasswort eingeben kann.

wie meinst du macht man das am besten. im moment amche ich adduser disconnecte schaue mir die antwort an
connecte wieder und setzte das passwort.

geht das auch ohne zwischenzeitlichen disconnect?

koskid
Newbie
Beiträge:12
Registriert:20. Aug 2004, 01:55
Kontaktdaten:

Beitrag von koskid » 20. Aug 2004, 14:29

ja, ich glaube ich hab es damals auch ohne zwischengeschobenes Disconnecten gemacht!

1. connect
2. adduser
3. changepw_user
4. addserver
5. close

So sollte es gehen, probiers doch einfach aus, Probieren geht über Studieren :D
So haste natürlich keine perfekte Fehlerüberprüfung. Wenn du die willst, dann wäre das mit dem /QUIT und darauf folgendem Auslesen der Antwort sinnvoll
www.xp-optimizer.de - www.adnix.de - life is a debugger

Benutzeravatar
Micki
Newbie
Beiträge:20
Registriert:27. Jul 2004, 16:53

Beitrag von Micki » 20. Aug 2004, 14:33

hehe denkfehler und formulierungsfehler meinerseits ;)

der disconnect is ja nötig, damit ich weiss, was der bnc geantwortet hat. weil
wenn:

ich adduser - bnc user added oder user already exists

wenn ich dann ohne das zu wissen das pw setze, kann ich ja auch von nem schon existierenden user das pw ändern

und das wäre ja blöd.

Gesperrt