1 package NDWeb::Controller::Users;
5 use parent 'Catalyst::Controller';
12 NDWeb::Controller::Users - Catalyst Controller
27 sub index :Path :Args(0) {
28 my ( $self, $c ) = @_;
31 my $query = $dbh->prepare(qq{SELECT u.uid,username,TRIM(',' FROM concat(g.groupname||',')) AS groups
32 FROM users u LEFT OUTER JOIN (groupmembers gm NATURAL JOIN groups g) ON gm.uid = u.uid
34 GROUP BY u.uid,username
35 ORDER BY lower(username)});
39 while (my $user = $query->fetchrow_hashref){
42 $c->stash(users => \@users);
46 my ( $self, $c, $user ) = @_;
49 $c->forward('findUser');
50 $user = $c->stash->{u};
52 my $groups = $dbh->prepare(q{SELECT g.gid,g.groupname,uid
54 LEFT OUTER JOIN (SELECT gid,uid FROM groupmembers WHERE uid = ?)
55 AS gm ON g.gid = gm.gid
57 $groups->execute($user->{uid});
62 while (my $group = $groups->fetchrow_hashref){
64 push @remgroups,$group;
66 push @addgroups,$group;
69 $c->stash(membergroups => \@remgroups);
70 $c->stash(othergroups => \@addgroups);
74 sub updateUser : Local {
75 my ( $self, $c, $user ) = @_;
78 $c->forward('findUser');
79 $user = $c->stash->{u};
83 my $log = $dbh->prepare(q{INSERT INTO forum_posts (ftid,uid,message) VALUES(
84 (SELECT ftid FROM users WHERE uid = $1),$1,$2)
87 my $delgroup = $dbh->prepare(q{DELETE FROM groupmembers WHERE uid = ? AND gid = ?});
88 my $addgroup = $dbh->prepare(q{INSERT INTO groupmembers (uid,gid) VALUES(?,?)});
89 for my $param ($c->req->param()){
90 if ($param =~ /^c:(planet|\w+_points|hostmask|info|username|email|sms)$/){
92 my $value = $c->req->param($column);
93 if ($column eq 'planet'){
96 }elsif($value =~ /^(\d+)\D+(\d+)\D+(\d+)$/){
97 ($value) = $dbh->selectrow_array(q{SELECT id FROM
98 current_planet_stats WHERE x = ? and y = ? and z =?}
102 $dbh->do(qq{UPDATE users SET $column = ? WHERE uid = ? }
103 ,undef,$value,$user->{uid});
104 $log->execute($c->user->id,"HC changed $column from $user->{$column} to $value for user: $user->{uid} ($user->{username})");
105 }elsif ($param =~ /^gr:(\d+)$/){
107 if ($c->req->param($param) eq 'remove'){
109 }elsif($c->req->param($param) eq 'add'){
113 $query->execute($user->{uid},$1);
114 my ($action,$a2) = ('added','to');
115 ($action,$a2) = ('removed','from') if $c->req->param($param) eq 'remove';
116 $log->execute($c->user->id,"HC $action user: $user->{uid} ($user->{username}) $a2 group: $1");
126 $c->res->redirect($c->uri_for('edit',$user->{uid}));
129 sub findUser : Private {
130 my ( $self, $c, $user ) = @_;
133 my $query = $dbh->prepare(q{
134 SELECT uid,username,hostmask,CASE WHEN u.planet IS NULL THEN '' ELSE coords(x,y,z) END AS planet,attack_points,defense_points,scan_points,humor_points,info, email, sms
135 FROM users u LEFT OUTER JOIN current_planet_stats p ON u.planet = p.id
138 $user = $dbh->selectrow_hashref($query,undef,$user);
140 $c->stash(u => $user);
144 my ( $self, $c ) = @_;
147 $c->stash(ok => $c->flash->{ok});
148 $c->stash(error => $c->flash->{error});
149 $c->stash(subject => $c->flash->{subject});
150 $c->stash(message => $c->flash->{message});
152 my $groups = $dbh->prepare(q{SELECT gid,groupname FROM groups WHERE gid > 0 ORDER BY gid});
155 push @groups,{gid => -1, groupname => 'Pick a group'};
156 while (my $group = $groups->fetchrow_hashref){
159 $c->stash(groups => \@groups);
162 sub postmail : Local {
163 my ( $self, $c ) = @_;
166 my $emails = $dbh->prepare(q{SELECT email FROM users
167 WHERE uid IN (SELECT uid FROM groupmembers WHERE gid = $1)
168 AND email is not null});
169 $emails->execute($c->req->param('group'));
171 while (my $email = $emails->fetchrow_hashref){
172 push @emails,$email->{email};
177 BCC => (join ',',@emails),
178 From => 'NewDawn Command <nd@ruin.nu>',
179 'Content-type' => 'text/plain; charset="UTF-8"',
180 Subject => $c->req->param('subject'),
181 Message => $c->req->param('message'),
184 if (sendmail %mail) {
185 $c->flash(ok => \@emails);
187 $c->flash(error => $Mail::Sendmail::error);
188 $c->flash(subject => $c->req->param('subject'));
189 $c->flash(message => $c->req->param('message'));
192 $c->res->redirect($c->uri_for('mail'));
197 Micahel Andreen (harv@ruin.nu)