# include gnu.gpl, (*) 2000 Micha 'malekith' Moskal <malekith@topnet.pl>. 
# $Id: cmd,v 1.2 2000/08/27 18:32:51 malekith Exp $ 

proc err(string s)
{
	puts(cmd{win}, "\e<error> " + s);
}

proc out(string s)
{
	puts(cmd{win}, s);
}

proc cmd_letbool()
{
	string s;
	
	s = tolower(cmd{argv2});

	if (cmd{argv1} == "") {
		out("current settings:");
		walk bools {
			out($key + " = " + itoa($val));
		}
		return;
	} else if (cmd{argv2} == "") {
		out(cmd{argv1} + " = " + itoa(bools[cmd{argv1}]));
		return;
	}
		
	if (s == "on" || s[0] == 'y' || s[0] == 't' || s[0] == '1')
		bools[cmd{argv1}] = 1;
	else if (s == "off" || s[0] == 'n' || s[0] == 'f' || s[0] == '0')
		bools[cmd{argv1}] = 0;
	else
		err("unknown bool value " + cmd{argv2});

	send_bools();
}

proc cmd_server()
{
	int port;
	string host;

	if (cmd{argv1} == "")
		return;
	if (cmd{argv2} != "")
		port = atoi(cmd{argv2});
	else if (cmd{argv1} @ /(.*):(\d+)$/) {
		host=$1;
		port=$2;
	}
	
	if (host == "")
		host = cmd{argv1};
	if (port == 0)
		port = 6667;
		
	info("connecting : " + host + " at " + itoa(port) + 
		" with home host == `" + home_host + "'");
	connect_to_server(host, port, home_host);
	
	put_server("USER " + getenv_def("USER", "user") + 
			" localhost " + host + " :" + real_name);
	put_server("NICK " + nick);
}

proc cmd_help()
{
	if (cmd{argv1} == "") {
		string h = "Help is available on topics:\n";
	
		walk command_help {
			h += $key + " ";
		}
		puts(window, h);
	} else {
		if (command_help[cmd{argv1}] == "")
			puts(window, "No help available for " + cmd{argv1});
		else
			puts(window, command_help[cmd{argv1}]);
	}
}

proc cmd__msg()
{
	if (cmd{argv1} == "") {
		info("--> bang");
		return;
	}
	if (window == "")
		return;
	put_server("PRIVMSG " + window + " :" + cmd{argv1});
	puts(window, `\e<you_start>$nick\e<you_end> $cmd{argv1}`);
}

proc cmd_bye()
{
	status("\e<info> shutting down ...");
	shutdown();
}

proc cmd_echo()
{
	info(`echo "$cmd{argv1}" "$cmd{argv2}" "$cmd{argv3}"`);
}

proc cmd_quote()
{
	put_server(cmd{argv1p});
}

proc cmd_join()
{
	string c = cmd{argv1};
	if (c == "")
		return;
	if (!(c @ /^[&#]/))
		c = "#" + c;
	put_server("JOIN :" + c);
	add_window(c);
	windows[irc_tolower(c)] = "c";
}

proc cmd_newwin()
{
	string c = cmd{argv1};
	if (c == "")
		return;
	add_window(c);
	if (!(c @ /^[&#]/))
		windows[irc_tolower(c)] = "c";
	else
		windows[irc_tolower(c)] = "q";
}

proc cmd_killwin()
{
	string c = cmd{argv1};
	kill_window(c);
	
	windows[irc_tolower(c)] = undef();
}

proc cmd_query()
{
	string c = cmd{argv1};
	if (c == "")
		return;
	add_window(c);
	windows[irc_tolower(c)] = "q";
}

proc cmd_part()
{
	string c = cmd{argv1};
	if (c == "" || c == ".")
		c = window;
	if (c == "")
		return;
	if (c @ /^[#&]/)
		put_server("PART " + c + " :" + cmd{argv2p});
	kill_window(c);
	
	windows[irc_tolower(c)] = undef();
}

proc cmd_msg()
{
	put_server(`PRIVMSG $cmd{argv1} :$cmd{argv2p}`);
	if (windows[irc_tolower(cmd{argv1})] == "")
		puts("", `\e<you_start>$nick:$cmd{argv1}\e<you_end> `
			`$cmd{argv2p}`);
	else
		puts(cmd{argv1}, `\e<you_start>$nick\e<you_end> `
			`$cmd{argv2p}`);
}

proc cmd_eval()
{
	eval(cmd{argv1p});
}

proc cmd_nick()
{
	if (cmd{argv1} == "")
		info(`You are (AFAIK) \cB$nick\cB`);
	else
		put_server(`NICK $cmd{argv1}`);
}

proc cmd_detach()
{
	detach("/detach request");
}

proc cmd_alias()
{
	string s;
	
	info(`adding alias "$cmd{argv1}" = "$cmd{argv2p}"`);
	s = cmd{argv2p};
	if (!(s @ /%/))
		s += " %1+";
		
	add_alias(cmd{argv1}, s);
}

proc cmd_rehash()
{
	info("rehashing ...");

	source(main_script);
	
	# cannot put any code here !!!!
	# this procedure is removed from memory during source()
}

proc ac(string cmd, string code, string params, string help)
{
	add_command(cmd, code);
	command_help[cmd] = `/$cmd $params\n$help`;
}

add_command("_msg", "cmd__msg();");
ac("bye", "cmd_bye();", "", 
	"kill bot session -- exit w/o possibility of retach");
ac("detach", "cmd_detach();", "",
	"kill client session -- exits interface w/ possibilty of retach");
ac("alias", "cmd_alias();", "<name> <command...>",
	"create alias for given command. ex: /alias m msg");
ac("rehash", "cmd_rehash();", "",
	"reload stadnard script");
ac("echo", "cmd_echo();", "<arg...>",
	"print given arguments");
ac("help", "cmd_help();", "[topic]",
	"print help on given topic or list of topics");
ac("server", "cmd_server();", "<servername> [port]",
	"connect to given IRC server");
ac("msg", "cmd_msg();", "<nickname|#channel> <message...>",
	"send given message to specified nick/channel");
ac("quote", "cmd_quote();", "<raw-server-command...>",
	"send raw command to server");
ac("query", "cmd_query();", "<nick>",
	"from now on send message to <nick> instead of channel");
ac("join", "cmd_join();", "<channel>",
	"join specified channel");
ac("part", "cmd_part();", "[channel]",
	"leave channel");
ac("nick", "cmd_nick();", "[nick]",
	"change your nick, or disaplays current one");
ac("killwin", "cmd_killwin();", "<win>",
	"remove window");
ac("newwin", "cmd_newwin();", "<win>",
	"add window");
ac("eval", "cmd_eval();", "<code...>",
	"evalutate any schiza code");
ac("letbool", "cmd_letbool();", "[variable [value]]",
	"set or show bool value");

add_alias("m", "msg %1+");
add_alias("j", "join %1+");
add_alias("q", "query %1+");
add_alias("quit", "bye %1+");
add_alias("signoff", "bye %1+");
add_alias("l", "part %1+");
add_alias("leave", "part %1+");
add_alias("whois", "quote whois %1+");
add_alias("wi", "whois %1+");
add_alias("who", "quote who %1+");
add_alias("ver", "msg %1 \cAVERSION\cA");
add_alias("mode", "quote mode %1+");
add_alias("away", "quote away :%1+");
add_alias("op", "mode %c +ooo %1+");
add_alias("deop", "mode %c -ooo %1+");
add_alias("voice", "mode %c +vvv %1+");
add_alias("devoice", "mode %c -vvv %1+");
add_alias("dop", "deop %1+");
add_alias("v", "voice %1+");
add_alias("dv", "devoice %1+");
add_alias("dev", "devoice %1+");
add_alias("me", "msg %c \cAACTION %1+\cA");
add_alias("topic", "quote topic :%1+");
add_alias("t", "topic %1+");
add_alias("ss", "letbool short_status_line %1+");
