]> ruin.nu Git - ndwebbie.git/blob - lib/NDWeb/Controller/Users.pm
9d70fc2626585fc1389e9c9d37ac0de5d0cc7b8c
[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 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
33                 WHERE u.uid > 0
34                 GROUP BY u.uid,username
35                 ORDER BY lower(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{SELECT g.gid,g.groupname,uid 
53                 FROM groups g 
54                 LEFT OUTER JOIN (SELECT gid,uid FROM groupmembers WHERE uid = ?)
55                         AS gm ON g.gid = gm.gid
56                 });
57         $groups->execute($user->{uid});
58
59
60         my @addgroups;
61         my @remgroups;
62         while (my $group = $groups->fetchrow_hashref){
63                 if ($group->{uid}){
64                         push @remgroups,$group;
65                 }else{
66                         push @addgroups,$group;
67                 }
68         }
69         $c->stash(membergroups => \@remgroups);
70         $c->stash(othergroups => \@addgroups);
71
72 }
73
74 sub updateUser : Local {
75         my ( $self, $c, $user ) = @_;
76         my $dbh = $c->model;
77
78         $c->forward('findUser');
79         $user = $c->stash->{u};
80
81         $dbh->begin_work;
82         eval{
83                 my $log = $dbh->prepare(q{INSERT INTO forum_posts (ftid,uid,message) VALUES(
84                         (SELECT ftid FROM users WHERE uid = $1),$1,$2)
85                         });
86
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)$/){
91                                 my $column = $1;
92                                 my $value = $c->req->param($column);
93                                 if ($column eq 'planet'){
94                                         if ($value eq ''){
95                                                 $value = undef;
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 =?}
99                                                         ,undef,$1,$2,$3);
100                                         }
101                                 }
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+)$/){
106                                 my $query;
107                                 if ($c->req->param($param) eq 'remove'){
108                                         $query = $delgroup;
109                                 }elsif($c->req->param($param) eq 'add'){
110                                         $query = $addgroup;
111                                 }
112                                 if ($query){
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");
117                                 }
118                         }
119                 }
120                 $dbh->commit;
121         };
122         if ($@){
123                 $dbh->rollback;
124                 die $@;
125         }
126         $c->res->redirect($c->uri_for('edit',$user->{uid}));
127 }
128
129 sub findUser : Private {
130         my ( $self, $c, $user ) = @_;
131         my $dbh = $c->model;
132
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
136                 WHERE uid = ?;
137                 });
138         $user = $dbh->selectrow_hashref($query,undef,$user);
139
140         $c->stash(u => $user);
141 }
142
143 sub mail : Local {
144         my ( $self, $c ) = @_;
145         my $dbh = $c->model;
146
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});
151
152         my $groups = $dbh->prepare(q{SELECT gid,groupname FROM groups WHERE gid > 0 ORDER BY gid});
153         $groups->execute;
154         my @groups;
155         push @groups,{gid => -1, groupname => 'Pick a group'};
156         while (my $group = $groups->fetchrow_hashref){
157                 push @groups,$group;
158         }
159         $c->stash(groups => \@groups);
160 }
161
162 sub postmail : Local {
163         my ( $self, $c ) = @_;
164         my $dbh = $c->model;
165
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'));
170         my @emails;
171         while (my $email = $emails->fetchrow_hashref){
172                 push @emails,$email->{email};
173         }
174
175         my %mail = (
176                 smtp => 'ruin.nu',
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'),
182         );
183
184         if (sendmail %mail) {
185                 $c->flash(ok => \@emails);
186         }else {
187                 $c->flash(error => $Mail::Sendmail::error);
188                 $c->flash(subject => $c->req->param('subject'));
189                 $c->flash(message => $c->req->param('message'));
190         }
191
192         $c->res->redirect($c->uri_for('mail'));
193 }
194
195 =head1 AUTHOR
196
197 Micahel Andreen (harv@ruin.nu)
198
199 =head1 LICENSE
200
201 GPL 2.0, or later.
202
203 =cut
204
205 1;