X-Git-Url: https://ruin.nu/git/?p=NDIRC.git;a=blobdiff_plain;f=Commands%2FUsermgm.pm;fp=Commands%2FUsermgm.pm;h=e530b84c8ac8049c8a35050d3670e25809ae9e30;hp=a5e3abf8a70ff478cc01e5ac9640b112e2760722;hb=468a4e3e07c0d9e6ed66a75c73f0d7ff2921b90a;hpb=cd18307dc7e3886266937935feffbb41b1df422d diff --git a/Commands/Usermgm.pm b/Commands/Usermgm.pm index a5e3abf..e530b84 100644 --- a/Commands/Usermgm.pm +++ b/Commands/Usermgm.pm @@ -25,35 +25,42 @@ use MooseX::Declare; use NDIRC::Dispatcher; command '+user' => { - help => q(syntax: .+user username [pnick] | username must be alphanum characters, if no pnick is given then it will be set to the same as username), + help => q(syntax: .+user username id | username must be alphanum characters, assumes discord id if it ends with #XXXX otherwise pnick), type => q(usermgmt), acl => 'irc_adduser' }, class extends NDIRC::Command { method execute ($c,$msg) { - my ($nick,$pnick) = $msg =~ /^(\w+)(?: ([^.\s]+))?$/ or die 'ARGS'; - $pnick //= $nick; + my ($nick,$id) = $msg =~ /^(\w+) (.+)$/ or die 'ARGS'; my $dbh = $c->model; - - my $host = "$pnick.users.netgamers.org"; - my ($username,$hostname,$p_nick) = $dbh->selectrow_array(q{ -SELECT username, hostmask,pnick -FROM users WHERE username = $1 OR hostmask = $2 OR pnick = $3 - },undef,$nick,$host,$pnick); + my $pnick = undef; + my $discordid = undef; + my $host = undef; + + if ($id =~ /.+#\d+/) { + $discordid = $id; + } else { + $pnick = $id; + $host = "$pnick.users.netgamers.org"; + } + my ($username,$hostname,$p_nick,$discord_id) = $dbh->selectrow_array(q{ +SELECT username, hostmask,pnick,discord_id +FROM users WHERE username = $1 OR hostmask = $2 OR pnick = $3 OR discord_id = $4 + },undef,$nick,$host,$pnick,$discordid); if (defined $username){ - $c->reply("$username ($p_nick) already exists with host: $hostname"); + $c->reply("$username ($p_nick, $discord_id) already exists with host: $hostname"); }else{ $dbh->do(q{ -INSERT INTO users (username,hostmask,pnick) VALUES($1,$2,$3) - },undef,$nick,$host,$pnick); - $c->reply("Added $nick(/$pnick) with host: $host"); +INSERT INTO users (username,hostmask,pnick,discord_id) VALUES($1,$2,$3,$4) + },undef,$nick,$host,$pnick,$discordid); + $c->reply("Added $nick(/$id)"); } } }; command '-user' => { - help => q(syntax: .-user nick | nick must be alphanum characters, if no pnick is given then it will be set to nick), + help => q(syntax: .-user nick | Deactivates a user), type => q(usermgmt), acl => 'irc_deactivateuser' }, class extends NDIRC::Command { @@ -67,8 +74,8 @@ command '-user' => { if ($f->rows == 1){ my $updated = $dbh->do(q{ -UPDATE users SET hostmask = $1, password = NULL WHERE uid = $2 - },undef,$username,$uid); +UPDATE users SET hostmask = NULL, discord_id = discord_id || '_', password = NULL WHERE uid = $1 + },undef,$uid); if ($updated > 0){ my $groups = $dbh->do(q{DELETE FROM groupmembers WHERE uid = ?},undef,$uid); $groups += 0; @@ -152,16 +159,16 @@ command whois => { my $f = $dbh->prepare(q{ -SELECT username, pnick, hostmask, array_to_string(array_agg(gid),'') AS flags +SELECT username, pnick, hostmask, discord_id, array_to_string(array_agg(gid),'') AS flags FROM users u LEFT OUTER JOIN (SELECT uid,gid FROM groupmembers ORDER BY uid,gid ) g USING (uid) WHERE username ILIKE ? -GROUP BY username,pnick,hostmask LIMIT 5 +GROUP BY username,pnick,hostmask,discord_id LIMIT 5 }); $f->execute($nick); while (my $user = $f->fetchrow_hashref){ - $c->reply("$user->{username} (/$user->{pnick}) flags: ($user->{flags}) host: $user->{hostmask}"); + $c->reply("$user->{username} ($user->{pnick},$user->{discord_id}) flags: ($user->{flags}) host: $user->{hostmask}"); } if ($f->rows == 0){ $c->reply("No hit, maybe spelling mistake, or add % as wildcard"); @@ -417,6 +424,42 @@ SELECT username,hostmask,pnick FROM users WHERE hostmask = $1 OR pnick = $2 } }; +command setdiscordid => { + help => q(Usage: .setdiscordid username discordid | Changes a user's discord id/tag Nick#id), + acl => q(bot_setdiscordid) +}, class extends NDIRC::Command { + method execute ($c,$msg) { + my ($nick,$discordid) = $msg =~ /^(\S+) (\S+)$/ or die 'ARGS'; + my $dbh = $c->model; + + my $f = $dbh->prepare(q{SELECT uid,username FROM users WHERE username ILIKE ?}); + $f->execute($nick); + my $user = $f->fetchrow_hashref; + if ($f->rows == 1){ + eval{ + $dbh->do(q{UPDATE users SET discord_id = NULLIF($1, 'NULL') WHERE uid = $2} + ,undef,$discordid,$user->{uid}); + $c->reply("Updated $user->{username}'s discord id to: $discordid"); + }; + if($@){ + if ($@ =~ /duplicate key value violates unique constraint/){ + my ($username, $discordid) = $dbh->selectrow_array(q{ +SELECT username,discord_id FROM users WHERE discord_id = $1 + },undef,$discordid); + $c->reply("Problem, $username already uses discord id $discordid."); + }else{ + die $@; + } + } + }elsif ($f->rows == 0){ + $c->reply("No hit, maybe spelling mistake, or add % as wildcard"); + }else{ + $c->reply("More than 1 user matched, please refine the search"); + } + $f->finish; + } +}; + my $points = class extends NDIRC::Command { has point => ( is => 'ro', @@ -549,4 +592,45 @@ ORDER BY amount*(metal+crystal+eonium)*CASE WHEN $1 = t1 THEN 1.0 ELSE 0.6 END D } }; +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 16; + my $update = $dbh->do(q{ +UPDATE users SET password = $1 +WHERE uid = $2 AND password IS NULL + },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;