2 * Copyright (c) 2017, orillion <orillion@rizon.net>
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions are met:
8 * * Redistributions of source code must retain the above copyright notice, this
9 * list of conditions and the following disclaimer.
10 * * Redistributions in binary form must reproduce the above copyright notice,
11 * this list of conditions and the following disclaimer in the documentation
12 * and/or other materials provided with the distribution.
14 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
15 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
16 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
17 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
18 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
19 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
20 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
21 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
22 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
23 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
24 * POSSIBILITY OF SUCH DAMAGE.
26 package net
.rizon
.acid
.plugins
.vizon
.db
;
28 import java
.sql
.PreparedStatement
;
29 import java
.sql
.ResultSet
;
30 import java
.sql
.SQLException
;
31 import java
.sql
.Statement
;
32 import java
.sql
.Timestamp
;
33 import java
.time
.LocalDateTime
;
34 import java
.util
.ArrayList
;
35 import java
.util
.Collection
;
36 import java
.util
.List
;
37 import net
.rizon
.acid
.plugins
.vizon
.Bet
;
38 import net
.rizon
.acid
.plugins
.vizon
.RequestStatus
;
39 import net
.rizon
.acid
.plugins
.vizon
.VizonBet
;
40 import net
.rizon
.acid
.sql
.SQL
;
41 import org
.slf4j
.Logger
;
42 import org
.slf4j
.LoggerFactory
;
46 * @author orillion <orillion@rizon.net>
48 public class VizonDatabase
50 private static final Logger logger
= LoggerFactory
.getLogger(VizonDatabase
.class);
51 private final SQL vizonSql
;
53 public VizonDatabase(SQL vizonSql
)
55 this.vizonSql
= vizonSql
;
59 * Finds a drawing by its id.
61 * @param id Id of the drawing.
63 * @return {@link VizonDrawing} or null if not found.
65 public VizonDrawing
getDrawingById(int id
)
69 PreparedStatement statement
= vizonSql
.prepare("SELECT * FROM vizon_drawings "
72 statement
.setInt(1, id
);
74 ResultSet rs
= vizonSql
.executeQuery(statement
);
78 return VizonDrawing
.fromResultSet(rs
);
83 catch (SQLException ex
)
85 logger
.warn("Unable to get next drawing in Vizon Database", ex
);
91 * Finds the drawing closest to the specified date.
93 * @param date Date to look up.
95 * @return {@link VizonDrawing} or null if none can be found.
97 public VizonDrawing
getDrawingByDate(LocalDateTime date
)
106 PreparedStatement statement
= vizonSql
.prepare("SELECT * FROM vizon_drawings "
107 + "ORDER BY ABS(TIMESTAMPDIFF(second, drawing_date, ?) "
110 statement
.setTimestamp(1, Timestamp
.valueOf(date
));
112 ResultSet rs
= vizonSql
.executeQuery(statement
);
116 return VizonDrawing
.fromResultSet(rs
);
121 catch (SQLException ex
)
123 logger
.warn("Unable to get next drawing in Vizon Database", ex
);
128 public VizonDrawing
getLatestDrawing()
132 PreparedStatement statement
= vizonSql
.prepare("SELECT * FROM vizon_drawings "
133 + "ORDER BY id DESC "
136 ResultSet rs
= vizonSql
.executeQuery(statement
);
140 return VizonDrawing
.fromResultSet(rs
);
145 catch (SQLException ex
)
147 logger
.warn("Unable to get next drawing in Vizon Database", ex
);
153 * Gets the next drawing that's scheduled to take place.
155 * @return {@link VizonDrawing} or null if nothing is scheduled.
157 public VizonDrawing
getNextDrawing()
161 PreparedStatement statement
= vizonSql
.prepare("SELECT * FROM vizon_drawings "
162 + "WHERE drawing_date >= NOW() "
163 + "ORDER BY drawing_date DESC "
166 ResultSet rs
= vizonSql
.executeQuery(statement
);
170 return VizonDrawing
.fromResultSet(rs
);
175 catch (SQLException ex
)
177 logger
.warn("Unable to get next drawing in Vizon Database", ex
);
182 public VizonUser
findUserById(int id
)
186 PreparedStatement statement
= vizonSql
.prepare("SELECT * FROM vizon_users "
189 statement
.setInt(1, id
);
191 ResultSet rs
= vizonSql
.executeQuery(statement
);
195 return VizonUser
.fromResultSet(rs
);
200 catch (SQLException ex
)
202 logger
.warn("Unable to find user by id in Vizon Database", ex
);
207 public VizonUser
findUser(String nick
)
216 PreparedStatement statement
= vizonSql
.prepare("SELECT * FROM vizon_users WHERE nick = ?");
217 statement
.setString(1, nick
);
219 ResultSet rs
= vizonSql
.executeQuery(statement
);
223 return VizonUser
.fromResultSet(rs
);
228 catch (SQLException ex
)
230 logger
.warn("Unable to select or create user in Vizon Database", ex
);
236 * Finds or creates a user. A user's id and nick are both unique in the
239 * @param nick Nick of the user. (Case insensitive)
241 * @return {@link VizonUser} or null if an error occurred.
243 public VizonUser
findOrCreateUser(String nick
)
252 PreparedStatement statement
= vizonSql
.prepare("SELECT * FROM vizon_users WHERE nick = ?");
253 statement
.setString(1, nick
);
255 ResultSet rs
= vizonSql
.executeQuery(statement
);
259 return VizonUser
.fromResultSet(rs
);
262 statement
= vizonSql
.prepare("INSERT INTO vizon_users (nick) VALUES(?)");
263 statement
.setString(1, nick
);
265 int result
= vizonSql
.executeUpdateBlocking(statement
);
269 // Unable to insert new user.
273 statement
= vizonSql
.prepare("SELECT * FROM vizon_users WHERE nick = ?");
274 statement
.setString(1, nick
);
276 rs
= vizonSql
.executeQuery(statement
);
280 return VizonUser
.fromResultSet(rs
);
285 catch (SQLException ex
)
287 logger
.warn("Unable to select or create user in Vizon Database", ex
);
292 public VizonRequest
findVhostRequestByUserId(int userId
)
296 PreparedStatement statement
= vizonSql
.prepare("SELECT vizon_requests.*, vizon_users.nick FROM vizon_requests "
297 + "INNER JOIN vizon_users "
298 + "ON vizon_users.id = vizon_requests.user_id "
299 + "WHERE user_id = ? "
301 statement
.setInt(1, userId
);
302 statement
.setInt(2, RequestStatus
.PENDING
);
304 ResultSet rs
= vizonSql
.executeQuery(statement
);
308 return VizonRequest
.fromResultSet(rs
);
313 catch (SQLException ex
)
315 logger
.warn("Unable to find vhost request for nick", ex
);
320 public VizonRequest
findVhostRequest(String nick
)
329 PreparedStatement statement
= vizonSql
.prepare("SELECT vizon_requests.*, vizon_users.nick FROM vizon_requests"
330 + "INNER JOIN vizon_users "
331 + "ON vizon_users.id = vizon_requests.user_id"
332 + "WHERE vizon_users.nick = ?");
333 statement
.setString(1, nick
);
335 ResultSet rs
= vizonSql
.executeQuery(statement
);
339 return VizonRequest
.fromResultSet(rs
);
344 catch (SQLException ex
)
346 logger
.warn("Unable to find vhost request for nick", ex
);
351 public Collection
<VizonRequest
> findPendingVhostRequests()
355 PreparedStatement statement
= vizonSql
.prepare("SELECT vizon_requests.*, vizon_users.nick FROM vizon_requests "
356 + "INNER JOIN vizon_users "
357 + "ON vizon_users.id = vizon_requests.user_id "
358 + "WHERE vizon_requests.status = ?");
359 statement
.setInt(1, RequestStatus
.PENDING
);
361 ResultSet rs
= vizonSql
.executeQuery(statement
);
363 List
<VizonRequest
> requests
= new ArrayList
<>();
367 VizonRequest request
= VizonRequest
.fromResultSet(rs
);
371 requests
.add(request
);
377 catch (SQLException ex
)
379 logger
.warn("Unable to find vhost request for nick", ex
);
384 public boolean insertRequest(VizonRequest request
)
393 PreparedStatement statement
= vizonSql
.prepare("INSERT INTO vizon_requests "
394 + "(user_id, vhost, status, reason, oper) "
395 + "VALUES (?, ?, ?, ?, ?)");
396 statement
.setInt(1, request
.getUserId());
397 statement
.setString(2, request
.getVhost());
398 statement
.setInt(3, request
.getStatus());
399 statement
.setString(4, request
.getReason());
400 statement
.setString(5, request
.getOper());
402 int result
= vizonSql
.executeUpdateBlocking(statement
);
406 catch (SQLException ex
)
408 logger
.warn("Unable to insert vhost request", ex
);
413 public boolean updateRequest(VizonRequest request
)
422 PreparedStatement statement
= vizonSql
.prepare("UPDATE vizon_requests "
428 statement
.setString(1, request
.getVhost());
429 statement
.setInt(2, request
.getStatus());
430 statement
.setString(3, request
.getReason());
431 statement
.setString(4, request
.getOper());
432 statement
.setInt(5, request
.getId());
434 int result
= vizonSql
.executeUpdateBlocking(statement
);
438 catch (SQLException ex
)
440 logger
.warn("Unable to insert vhost request", ex
);
445 public boolean updateUser(VizonUser user
)
454 PreparedStatement statement
= vizonSql
.prepare("UPDATE vizon_users "
459 + "obtained_id = ?, "
466 statement
.setString(1, user
.getVhost());
467 statement
.setBoolean(2, user
.isEligible());
468 statement
.setBoolean(3, user
.isBold());
469 statement
.setTimestamp(4, Timestamp
.valueOf(user
.getObtained()));
470 statement
.setInt(5, user
.getObtainedId());
471 statement
.setInt(6, user
.getMultiplier());
472 statement
.setBoolean(7, user
.isJackpot());
473 statement
.setBoolean(8, user
.isPermanent());
474 statement
.setInt(9, user
.getDays());
475 statement
.setInt(10, user
.getId());
477 int updated
= vizonSql
.executeUpdateBlocking(statement
);
481 catch (SQLException ex
)
483 logger
.warn("Unable to select bet for user and drawing in Vizon Database", ex
);
488 public boolean updateDrawing(VizonDrawing drawing
)
497 PreparedStatement statement
= vizonSql
.prepare("UPDATE vizon_drawings "
506 statement
.setInt(1, drawing
.getDraws().get(0));
507 statement
.setInt(2, drawing
.getDraws().get(1));
508 statement
.setInt(3, drawing
.getDraws().get(2));
509 statement
.setInt(4, drawing
.getDraws().get(3));
510 statement
.setInt(5, drawing
.getDraws().get(4));
511 statement
.setInt(6, drawing
.getDraws().get(5));
512 statement
.setInt(7, drawing
.getId());
514 int updated
= vizonSql
.executeUpdateBlocking(statement
);
518 catch (SQLException ex
)
520 logger
.warn("Unable to select bet for user and drawing in Vizon Database", ex
);
526 * Attempts to find a {@link VizonBet} of the user for the specified
529 * @param user User to find for.
530 * @param drawing Drawing to find for.
532 * @return {@link VizonBet} or null if none can be found.
534 public VizonBet
findBetForUserAndDrawing(VizonUser user
, VizonDrawing drawing
)
536 if (user
== null || drawing
== null)
543 PreparedStatement statement
= vizonSql
.prepare("SELECT * FROM vizon_bets WHERE vizon_users_id = ? AND vizon_drawings_id = ?");
544 statement
.setInt(1, user
.getId());
545 statement
.setInt(2, drawing
.getId());
547 ResultSet rs
= vizonSql
.executeQuery(statement
);
551 return VizonBet
.fromResultSet(rs
);
556 catch (SQLException ex
)
558 logger
.warn("Unable to select bet for user and drawing in Vizon Database", ex
);
563 public List
<VizonBet
> findBetsForUser(VizonUser user
)
568 public List
<VizonBet
> findBetsForDrawing(VizonDrawing drawing
)
570 List
<VizonBet
> bets
= new ArrayList
<>();
579 PreparedStatement statement
= vizonSql
.prepare("SELECT * FROM vizon_bets WHERE vizon_drawings_id = ?");
580 statement
.setInt(1, drawing
.getId());
582 ResultSet rs
= vizonSql
.executeQuery(statement
);
586 VizonBet bet
= VizonBet
.fromResultSet(rs
);
596 catch (SQLException ex
)
598 logger
.warn("Unable to select bets for drawing in Vizon Database", ex
);
605 * Creates a new bet for the user for the specified drawing.
607 * @param user User to place the bet for.
608 * @param drawing Drawing to place the bet in.
609 * @param bet Bet to place.
611 * @return True if successful, false otherwise.
613 public boolean createBetForUser(VizonUser user
, VizonDrawing drawing
, Bet bet
)
615 if (user
== null || drawing
== null || bet
== null)
622 PreparedStatement statement
= vizonSql
.prepare("INSERT INTO vizon_bets "
623 + "(vizon_users_id, vizon_drawings_id, first, second, third, fourth, fifth, sixth) "
624 + "VALUES(?, ?, ?, ?, ?, ?, ?, ?)");
626 statement
.setInt(1, user
.getId());
627 statement
.setInt(2, drawing
.getId());
628 statement
.setInt(3, bet
.getFirst());
629 statement
.setInt(4, bet
.getSecond());
630 statement
.setInt(5, bet
.getThird());
631 statement
.setInt(6, bet
.getFourth());
632 statement
.setInt(7, bet
.getFifth());
633 statement
.setInt(8, bet
.getSixth());
635 int inserted
= vizonSql
.executeUpdateBlocking(statement
);
639 catch (SQLException ex
)
641 logger
.warn("Error while inserting bet for user in Vizon Database", ex
);
647 * Finds a scheduled drawing that has not been run yet (i.e. First == null)
649 * @return {@link VizonDrawing} or null if no unrun drawings exist
651 public VizonDrawing
findEarliestUnrunDrawing()
655 PreparedStatement statement
= vizonSql
.prepare("SELECT * FROM vizon_drawings "
656 + "WHERE first IS NULL "
657 + "ORDER BY drawing_date "
660 ResultSet rs
= vizonSql
.executeQuery(statement
);
667 return VizonDrawing
.fromResultSet(rs
);
669 catch (SQLException ex
)
671 logger
.warn("Error while trying to find earliest drawing in Vizon Database", ex
);
676 public VizonDrawing
createDrawing(LocalDateTime date
)
680 PreparedStatement statement
= vizonSql
.prepare("INSERT INTO vizon_drawings "
683 Statement
.RETURN_GENERATED_KEYS
);
685 statement
.setTimestamp(1, Timestamp
.valueOf(date
));
687 int inserted
= vizonSql
.executeUpdateBlocking(statement
);
689 ResultSet rs
= statement
.getGeneratedKeys();
691 if (rs
== null || !rs
.next())
696 int id
= rs
.getInt(1);
698 statement
= vizonSql
.prepare("SELECT * FROM vizon_drawings "
701 statement
.setInt(1, id
);
703 rs
= vizonSql
.executeQuery(statement
);
705 if (rs
== null || !rs
.next())
710 return VizonDrawing
.fromResultSet(rs
);
712 catch (SQLException ex
)
714 logger
.warn("Error while trying to create drawing in Vizon Database", ex
);
719 public List
<VizonUser
> findAllUsers()
721 List
<VizonUser
> users
= new ArrayList
<>();
725 PreparedStatement statement
= vizonSql
.prepare("SELECT * FROM vizon_users");
727 ResultSet rs
= vizonSql
.executeQuery(statement
);
731 VizonUser user
= VizonUser
.fromResultSet(rs
);
741 catch (SQLException ex
)
743 logger
.warn("Error while trying to get all users in Vizon Database", ex
);
749 public int expireVhosts()
753 PreparedStatement statement
= vizonSql
.prepare("UPDATE vizon_users "
754 + "SET vhost = null, "
756 + "obtained = null, "
757 + "obtained_id = -1, "
762 + "WHERE permanent = 0 "
763 + "AND DATE_ADD(obtained, INTERVAL days DAY) < NOW()");
765 return vizonSql
.executeUpdateBlocking(statement
);
768 catch (SQLException ex
)
770 logger
.warn("Error in SQL statement to expire vhosts", ex
);