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 uid,username,array_to_string(array_agg(g.groupname),', ') AS groups
32 FROM users u LEFT OUTER JOIN (groupmembers gm NATURAL JOIN groups g) USING (uid)
34 GROUP BY u.uid,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{
53 SELECT g.gid,g.groupname,uid
55 LEFT OUTER JOIN (SELECT gid,uid FROM groupmembers WHERE uid = ?)
59 $groups->execute($user->{uid});
64 while (my $group = $groups->fetchrow_hashref){
66 push @remgroups,$group;
68 push @addgroups,$group;
71 $c->stash(membergroups => \@remgroups);
72 $c->stash(othergroups => \@addgroups);
76 sub updateUser : Local {
77 my ( $self, $c, $user ) = @_;
80 $c->forward('findUser');
81 $user = $c->stash->{u};
85 my $log = $dbh->prepare(q{INSERT INTO forum_posts (ftid,uid,message) VALUES(
86 (SELECT ftid FROM users WHERE uid = $1),$1,$2)
89 my $delgroups = $dbh->prepare(q{DELETE FROM groupmembers WHERE uid = $1 AND gid = ANY($2) });
90 my $addgroups = $dbh->prepare(q{INSERT INTO groupmembers (uid,gid) (SELECT $1,unnest($2::text[]))});
91 for my $param ($c->req->param()){
92 if ($param =~ /^c:(planet|\w+_points|hostmask|info|username|email|sms)$/){
94 my $value = $c->req->param($column);
95 if ($column eq 'planet'){
99 }elsif($value =~ /^(\d+)\D+(\d+)\D+(\d+)$/){
100 ($value) = $dbh->selectrow_array(q{SELECT pid FROM
101 current_planet_stats WHERE x = ? and y = ? and z =?}
105 $dbh->do(qq{UPDATE users SET $column = ? WHERE uid = ? }
106 ,undef,$value,$user->{uid});
107 $log->execute($c->user->id,"HC changed $column from $user->{$column} to $value for user: $user->{uid} ($user->{username})");
108 }elsif ($param eq 'add_group'){
109 my @groups = $c->req->param($param);
110 $addgroups->execute($user->{uid},\@groups);
111 $log->execute($c->user->id,"HC added user: $user->{uid} ($user->{username}) to groups: @groups");
112 }elsif ($param eq 'remove_group'){
113 my @groups = $c->req->param($param);
114 $delgroups->execute($user->{uid},\@groups);
115 $log->execute($c->user->id,"HC removed user: $user->{uid} ($user->{username}) from groups: @groups");
124 $c->res->redirect($c->uri_for('edit',$user->{uid}));
127 sub findUser : Private {
128 my ( $self, $c, $user ) = @_;
131 my $query = $dbh->prepare(q{
132 SELECT uid,username,hostmask,attack_points,defense_points,scan_points,humor_points,info, email, sms
133 ,COALESCE(coords(x,y,z),'') AS planet, pid
134 FROM users u LEFT OUTER JOIN current_planet_stats p USING (pid)
137 $user = $dbh->selectrow_hashref($query,undef,$user);
139 $c->stash(u => $user);
143 my ( $self, $c ) = @_;
146 $c->stash(ok => $c->flash->{ok});
147 $c->stash(error => $c->flash->{error});
148 $c->stash(subject => $c->flash->{subject});
149 $c->stash(message => $c->flash->{message});
151 my $groups = $dbh->prepare(q{SELECT gid,groupname FROM groups WHERE gid <> '' ORDER BY gid});
154 push @groups,{gid => -1, groupname => 'Pick a group'};
155 while (my $group = $groups->fetchrow_hashref){
158 $c->stash(groups => \@groups);
161 sub postmail : Local {
162 my ( $self, $c ) = @_;
165 my $emails = $dbh->prepare(q{SELECT email FROM users
166 WHERE uid IN (SELECT uid FROM groupmembers WHERE gid = $1)
167 AND email is not null});
168 $emails->execute($c->req->param('group'));
170 while (my $email = $emails->fetchrow_hashref){
171 push @emails,$email->{email};
176 BCC => (join ',',@emails),
177 From => 'NewDawn Command <nd@ruin.nu>',
178 'Content-type' => 'text/plain; charset="UTF-8"',
179 Subject => $c->req->param('subject'),
180 Message => $c->req->param('message'),
183 if (sendmail %mail) {
184 $c->flash(ok => \@emails);
186 $c->flash(error => $Mail::Sendmail::error);
187 $c->flash(subject => $c->req->param('subject'));
188 $c->flash(message => $c->req->param('message'));
191 $c->res->redirect($c->uri_for('mail'));
196 Micahel Andreen (harv@ruin.nu)