]> ruin.nu Git - ndwebbie.git/blob - lib/NDWeb/Controller/Users.pm
67fb97f6545c4e9213d41bfa5120a35fb3e6ed87
[ndwebbie.git] / lib / NDWeb / Controller / Users.pm
1 package NDWeb::Controller::Users;
2
3 use strict;
4 use warnings;
5 use parent 'Catalyst::Controller';
6
7 use ND::Include;
8 use Mail::Sendmail;
9
10 =head1 NAME
11
12 NDWeb::Controller::Users - Catalyst Controller
13
14 =head1 DESCRIPTION
15
16 Catalyst Controller.
17
18 =head1 METHODS
19
20 =cut
21
22
23 =head2 index 
24
25 =cut
26
27 sub index :Path :Args(0) {
28         my ( $self, $c ) = @_;
29         my $dbh = $c->model;
30
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)
33                 WHERE uid > 0
34                 GROUP BY u.uid,username
35                 ORDER BY username});
36         $query->execute;
37
38         my @users;
39         while (my $user = $query->fetchrow_hashref){
40                 push @users, $user;
41         }
42         $c->stash(users => \@users);
43 }
44
45 sub edit : Local {
46         my ( $self, $c, $user ) = @_;
47         my $dbh = $c->model;
48
49         $c->forward('findUser');
50         $user = $c->stash->{u};
51
52         my $groups = $dbh->prepare(q{
53 SELECT g.gid,g.groupname,uid
54 FROM groups g
55         LEFT OUTER JOIN (SELECT gid,uid FROM groupmembers WHERE uid = ?)
56         AS gm USING(gid)
57 WHERE gid <> ''
58                 });
59         $groups->execute($user->{uid});
60
61
62         my @addgroups;
63         my @remgroups;
64         while (my $group = $groups->fetchrow_hashref){
65                 if ($group->{uid}){
66                         push @remgroups,$group;
67                 }else{
68                         push @addgroups,$group;
69                 }
70         }
71         $c->stash(membergroups => \@remgroups);
72         $c->stash(othergroups => \@addgroups);
73
74 }
75
76 sub updateUser : Local {
77         my ( $self, $c, $user ) = @_;
78         my $dbh = $c->model;
79
80         $c->forward('findUser');
81         $user = $c->stash->{u};
82
83         $dbh->begin_work;
84         eval{
85                 my $log = $dbh->prepare(q{INSERT INTO forum_posts (ftid,uid,message) VALUES(
86                         (SELECT ftid FROM users WHERE uid = $1),$1,$2)
87                         });
88
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)$/){
93                                 my $column = $1;
94                                 my $value = $c->req->param($column);
95                                 if ($column eq 'planet'){
96                                         $column = 'pid';
97                                         if ($value eq ''){
98                                                 $value = undef;
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 =?}
102                                                         ,undef,$1,$2,$3);
103                                         }
104                                 }
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");
116                         }
117                 }
118                 $dbh->commit;
119         };
120         if ($@){
121                 $dbh->rollback;
122                 die $@;
123         }
124         $c->res->redirect($c->uri_for('edit',$user->{uid}));
125 }
126
127 sub findUser : Private {
128         my ( $self, $c, $user ) = @_;
129         my $dbh = $c->model;
130
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)
135 WHERE uid = ?;
136                 });
137         $user = $dbh->selectrow_hashref($query,undef,$user);
138
139         $c->stash(u => $user);
140 }
141
142 sub mail : Local {
143         my ( $self, $c ) = @_;
144         my $dbh = $c->model;
145
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});
150
151         my $groups = $dbh->prepare(q{SELECT gid,groupname FROM groups WHERE gid <> '' ORDER BY gid});
152         $groups->execute;
153         my @groups;
154         push @groups,{gid => -1, groupname => 'Pick a group'};
155         while (my $group = $groups->fetchrow_hashref){
156                 push @groups,$group;
157         }
158         $c->stash(groups => \@groups);
159 }
160
161 sub postmail : Local {
162         my ( $self, $c ) = @_;
163         my $dbh = $c->model;
164
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'));
169         my @emails;
170         while (my $email = $emails->fetchrow_hashref){
171                 push @emails,$email->{email};
172         }
173
174         my %mail = (
175                 smtp => 'ruin.nu',
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'),
181         );
182
183         if (sendmail %mail) {
184                 $c->flash(ok => \@emails);
185         }else {
186                 $c->flash(error => $Mail::Sendmail::error);
187                 $c->flash(subject => $c->req->param('subject'));
188                 $c->flash(message => $c->req->param('message'));
189         }
190
191         $c->res->redirect($c->uri_for('mail'));
192 }
193
194 =head1 AUTHOR
195
196 Micahel Andreen (harv@ruin.nu)
197
198 =head1 LICENSE
199
200 GPL 2.0, or later.
201
202 =cut
203
204 1;