#**************************************************************************
#   Copyright (C) 2009 by Michael Andreen <harvATruinDOTnu>               *
#                                                                         *
#   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        *
#   MERCHANTABILITY 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.,                                       *
#   51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.         *
#**************************************************************************/

use strict;
use warnings;
use feature ':5.10';

use MooseX::Declare;
use NDIRC::Dispatcher;

my $access = class extends NDIRC::Command {
	method execute ($c,$msg) {
		$self->name =~ /(de)?(op|voice)/;
		my @access = ($2);
		my $mod = $1 ? '-' : '';

		if ($msg =~ /^\s*$/){
			$msg = $c->nick;
			push @access, "auto_$access[0]";
		}

		my $mode = q{
SELECT DISTINCT LOWER(flag) FROM users u
	JOIN groupmembers g USING (uid)
	JOIN channel_group_flags gf USING (gid)
	JOIN channel_flags f USING (flag)
WHERE uid = $1 AND channel = $2 AND f.name = ANY($3);
		};
		if ($c->check_user_roles(qw/irc_masterop/)){
			$mode = substr $access[0], 0,1;
		}else{
			($mode) = $c->model->selectrow_array($mode,undef,$c->uid,$c->channel,\@access);
		}
		if ($mode){
			$c->command(mode => $c->channel, "$mod$mode", $msg);
		}else{
			$c->reply("No access to " . $self->name . " in this channel");
		}
	}
};

command op => {
	help => q(syntax: .op [nicks] | Gives op to the specified nicks, or yourself if no command is given),
	type => q(channel),
}, $access;

command deop => {
	help => q(syntax: .deop [nicks] | Removes op from the specified nicks, or yourself if no command is given),
	type => q(channel),
}, $access;

command voice => {
	help => q(syntax: .voice [nicks] | Gives voice to the specified nicks, or yourself if no command is given),
	type => q(channel),
}, $access;

command devoice => {
	help => q(syntax: .voice [nicks] | Removes voice from the specified nicks, or yourself if no command is given),
	type => q(channel),
}, $access;

command invite => {
	help => q(Syntax: invite [channel] | If no channel is specified it invites you to all channel you have auto invite access on),
	type => q(pm)
}, class extends NDIRC::Command {
	method execute ($c,$msg) {
		my ($channel) = $msg =~ /^\s*(\S+)?\s*$/ or die 'ARGS';

		my @channels;
		if ($channel && $c->check_user_roles('irc_masterinvite')){
			push @channels,$channel;
		}else{
			my @access = ('i');
			push @access, 'I' if $channel;
			my $channels = $c->model->prepare(q{
SELECT DISTINCT channel FROM users u
	JOIN groupmembers g USING (uid)
	JOIN channel_group_flags gf USING (gid)
WHERE uid = $1 AND COALESCE(channel = $2,TRUE)
	AND (flag = ANY($3) )
				});
			$channels->execute($c->uid,$channel,\@access);
			while (my ($channel) = $channels->fetchrow()){
				push @channels,$channel;
			}
		}
		for (@channels){
			$c->command(invite => $c->nick, $_);
		}
	}
};

command hostname => {
	help => q(Shows your hostname, as seen by the bots.)
}, class extends NDIRC::Command {
	method execute ($c,$msg) {
		$c->reply('Your hostname is: '.$c->host);
	}
};

command getpass => {
	help => q(Gives new users a random password.),
	type => q(pm)
}, class extends NDIRC::Command {

###########################################################
# Written by Guy Malachi http://guymal.com
# 18 August, 2002
###########################################################
	sub generate_random_string
	{
		my $length_of_randomstring=shift;# the length of
		# the random string to generate

		my @chars=('a'..'z','A'..'Z','0'..'9','_');
		my $random_string;
		foreach (1..$length_of_randomstring)
		{
			# rand @chars will generate a random
			# number between 0 and scalar @chars
			$random_string .= $chars[rand @chars];
		}
		return $random_string;
	}

	method execute ($c,$msg) {
		my $dbh = $c->model;

		my $password = generate_random_string 10;
		my $update = $dbh->do(q{
UPDATE users SET password = MD5( ? )
WHERE uid = ? AND password =''
			},undef,$password,$c->uid);
		if ($update > 0){
			$c->reply("Password set to: $password (you can change it on webbie)");
		}else{
			$c->reply("Couldn't set password. Either it has already been set or you don't have an account");
		}
	}
};

1;
