view ircrelay/ircrelay_admincmd.php @ 2:7e342a0a3b74 draft default tip

Fixed UDP mode in hub
author Ivo Smits <Ivo@UCIS.nl>
date Sat, 04 May 2013 00:36:14 +0200
parents dd81c38b513a
children
line wrap: on
line source

<?php
function admincmd($parts) {
	global $channels, $networks;
	switch (strtolower($parts[0])) {
		case 'die': exit(0);
		case 'c': case 'chn': case 'chan': case 'channel':
			switch (strtolower($parts[1])) {
				case 'join': case 'part': case 'rejoin': case 'msg': case 'links':
					if (!isset($channels[$parts[2]])) return 'ERR Channel does not exist';
					return admincmd_channel($parts[1], $channels[$parts[2]], array_slice($parts, 3));
				case 'list': return 'OK '.implode('; ', array_keys($channels));
				case 'help':
					return 'OK list; links [ch]; join [ch]; part [ch]; rejoin [ch]; msg [ch] [msg]; help';
			}
			break;
		case 'n': case 'net': case 'network':
			switch (strtolower($parts[1])) {
				case 'disconnect': case 'raw': case 'join': case 'part': case 'rejoin': case 'msg': case 'delete': case 'info': case 'status': case 'channels': case 'set': case 'active': case 'ipv6': case 'link': case 'unlink': case 'linkinfo':
					if (!isset($networks[$parts[2]])) return 'ERR Network does not exist';
					return admincmd_network($parts[1], $networks[$parts[2]], array_slice($parts, 3));
				case 'list': return 'OK '.implode('; ', array_keys($networks));
				case 'help':
					return 'OK list; disconnect [net]; raw [net] [text]; join [net] [ch]; part [net] [ch]; rejoin [net] [ch]; msg [net] [ch] [msg]; help; delete; info; status; channels; set [name] [server] [port] [nick]; active [enable]; ipv6 [enable]; link [name] [channel] [display]; unlink [name]; linkinfo [name]';
			}
			break;
		case 'help':
			return 'OK die; channel help; network help';
	}
	return 'ERR Unknown command';
}
function admincmd_channel($cmd, $chn, $parts) {
	switch (strtolower($cmd)) {
		case 'links':
			$arr = array();
			foreach ($chn->links as $link) $arr[] = $link->network->key.'/'.$link->name;
			return 'OK '.implode('; ', $arr);
		case 'join':
			foreach ($chn->links as $link) if ($link->network->connected) network_send($link->network, 'JOIN '.$link->name);
			return 'OK';
		case 'part':
			foreach ($chn->links as $link) if ($link->network->connected) network_send($link->network, 'PART '.$link->name);
			return 'OK';
		case 'rejoin':
			foreach ($chn->links as $link) if ($link->network->connected) network_send($link->network, 'PART '.$link->name);
			foreach ($chn->links as $link) if ($link->network->connected) network_send($link->network, 'JOIN '.$link->name);
			return 'OK';
		case 'msg':
			foreach ($chn->links as $link) if ($link->network->connected) network_send($link->network, 'PRIVMSG '.$link->name.' :'.implode(' ', array_slice($parts, 0)));
			return 'OK';
	}
	return 'ERR Unknown command';
}
function admincmd_network($cmd, $net, $parts) {
	global $channels;
	switch (strtolower($cmd)) {
		case 'disconnect':
			network_reset($net);
			return 'OK';
		case 'raw':
			network_send($net, implode(' ', array_slice($parts, 0)));
			return 'OK';
		case 'join':
			network_send($net, 'JOIN '.$parts[0]);
			return 'OK';
		case 'part':
			network_send($net, 'PART '.$parts[0]);
			return 'OK';
		case 'rejoin':
			network_send($net, 'JOIN '.$parts[0]);
			network_send($net, 'PART '.$parts[0]);
			return 'OK';
		case 'msg':
			network_send($net, 'PRIVMSG '.$parts[0].' :'.implode(' ', array_slice($parts, 1)));
			return 'OK';
		case 'delete':
			network_Reset($net);
			unset($networks[$net->key]);
			return 'OK';
		case 'info':
			return 'OK key='.$net->key.'; name='.$net->name.'; server='.$net->server.'; port='.$net->port.'; nick='.$net->nick.'; active='.$net->active.'; af='.$net->addressfamily;
		case 'status':
			return 'OK connected='.$net->connected.'; connecting='.$net->connecting.'; timeout='.$net->timeout.'; nick='.$net->realnick;
		case 'channels':
			return 'OK '.implode('; ', array_keys($net->channels));
		case 'set':
			$net->name = $parts[0];
			$net->server = $parts[1];
			$net->port = (int)$parts[2];
			$net->nick = $parts[3];
			return 'OK';
		case 'active':
			$net->active = $parts[0];
			return 'OK';
		case 'ipv6':
			$net->addressfamily = $parts[0] ? AF_INET6 : AF_INET;
			return 'OK';
		case 'link':
			if (isset($net->channels[$parts[0]])) return 'ERR Channel already linked';
			$link = new NetworkChannel();
			$link->name = $parts[0];
			$link->network = $net;
			$link->channel = getchannel($parts[1]);
			$link->display = implode(' ', array_slice($parts, 2));
			$link->channel->links[] = $link;
			$net->channels[$link->name] = $link;
			if ($net->connected && $link->name[0] == '#') network_send($net, 'JOIN '.$link->name);
			return 'OK';
		case 'unlink':
			if (!isset($net->channels[$parts[0]])) return 'ERR Channel not linked';
			$link = $net->channels[$parts[0]];
			unset($net->channels[$link->name]);
			foreach ($link->channel->links as $k => $l) if ($l === $link) unset($link->channel->links[$k]);
			if (!count($link->channel->links)) unset($channels[$link->channel->name]);
			if ($net->connected && $link->name[0] == '#') network_send($net, 'PART '.$link->name);
			return 'OK';
		case 'linkinfo':
			if (!isset($net->channels[$parts[0]])) return 'ERR Channel not linked';
			$link = $net->channels[$parts[0]];
			return 'OK channel='.$link->channel->name.'; display='.$link->display;
	}
	return 'ERR Unknown command';
}