Reupload
This commit is contained in:
parent
2c73c4baec
commit
400eb896b1
7
README.md
Normal file
7
README.md
Normal file
@ -0,0 +1,7 @@
|
|||||||
|
# Bunker
|
||||||
|
Bunker - telegram bot, that provides ability to play a post-apocalypse survival game.
|
||||||
|
|
||||||
|
## Description
|
||||||
|
|
||||||
|
This bot acts as a "game master", providing unique game experience for you and your friends.
|
||||||
|
|
113
pom.xml
Normal file
113
pom.xml
Normal file
@ -0,0 +1,113 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<project xmlns="http://maven.apache.org/POM/4.0.0"
|
||||||
|
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||||
|
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
|
||||||
|
<modelVersion>4.0.0</modelVersion>
|
||||||
|
|
||||||
|
<parent>
|
||||||
|
<groupId>org.springframework.boot</groupId>
|
||||||
|
<artifactId>spring-boot-starter-parent</artifactId>
|
||||||
|
<version>3.0.0</version>
|
||||||
|
</parent>
|
||||||
|
|
||||||
|
<groupId>com.alterdekim.javabot</groupId>
|
||||||
|
<artifactId>bunker</artifactId>
|
||||||
|
<version>1.0-SNAPSHOT</version>
|
||||||
|
<packaging>jar</packaging>
|
||||||
|
|
||||||
|
<properties>
|
||||||
|
<maven.compiler.source>1.8</maven.compiler.source>
|
||||||
|
<maven.compiler.target>1.8</maven.compiler.target>
|
||||||
|
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
|
||||||
|
</properties>
|
||||||
|
|
||||||
|
<dependencies>
|
||||||
|
<dependency>
|
||||||
|
<groupId>log4j</groupId>
|
||||||
|
<artifactId>log4j</artifactId>
|
||||||
|
<version>1.2.17</version>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.springframework.boot</groupId>
|
||||||
|
<artifactId>spring-boot-devtools</artifactId>
|
||||||
|
<scope>runtime</scope>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.springframework.boot</groupId>
|
||||||
|
<artifactId>spring-boot-starter-data-jpa</artifactId>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.springframework.boot</groupId>
|
||||||
|
<artifactId>spring-boot-starter-thymeleaf</artifactId>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.springframework.boot</groupId>
|
||||||
|
<artifactId>spring-boot-starter-web</artifactId>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.thymeleaf.extras</groupId>
|
||||||
|
<artifactId>thymeleaf-extras-springsecurity6</artifactId>
|
||||||
|
<!-- Temporary explicit version to fix Thymeleaf bug -->
|
||||||
|
<version>3.1.1.RELEASE</version>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.springframework.boot</groupId>
|
||||||
|
<artifactId>spring-boot-starter-validation</artifactId>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>mysql</groupId>
|
||||||
|
<artifactId>mysql-connector-java</artifactId>
|
||||||
|
<version>8.0.33</version>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.projectlombok</groupId>
|
||||||
|
<artifactId>lombok</artifactId>
|
||||||
|
<optional>true</optional>
|
||||||
|
<version>1.18.28</version>
|
||||||
|
<scope>provided</scope>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.springframework.boot</groupId>
|
||||||
|
<artifactId>spring-boot-starter-test</artifactId>
|
||||||
|
<scope>test</scope>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.springframework.boot</groupId>
|
||||||
|
<artifactId>spring-boot-starter-security</artifactId>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.telegram</groupId>
|
||||||
|
<artifactId>telegrambots-spring-boot-starter</artifactId>
|
||||||
|
<version>6.7.0</version>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.telegram</groupId>
|
||||||
|
<artifactId>telegrambots-abilities</artifactId>
|
||||||
|
<version>6.7.0</version>
|
||||||
|
</dependency>
|
||||||
|
</dependencies>
|
||||||
|
|
||||||
|
<build>
|
||||||
|
<plugins>
|
||||||
|
<plugin>
|
||||||
|
<groupId>org.springframework.boot</groupId>
|
||||||
|
<artifactId>spring-boot-maven-plugin</artifactId>
|
||||||
|
<executions>
|
||||||
|
<execution>
|
||||||
|
<goals>
|
||||||
|
<goal>repackage</goal>
|
||||||
|
</goals>
|
||||||
|
</execution>
|
||||||
|
</executions>
|
||||||
|
<configuration>
|
||||||
|
<excludes>
|
||||||
|
<exclude>
|
||||||
|
<groupId>org.projectlombok</groupId>
|
||||||
|
<artifactId>lombok</artifactId>
|
||||||
|
</exclude>
|
||||||
|
</excludes>
|
||||||
|
</configuration>
|
||||||
|
</plugin>
|
||||||
|
</plugins>
|
||||||
|
</build>
|
||||||
|
</project>
|
25
src/main/java/com/alterdekim/javabot/Application.java
Normal file
25
src/main/java/com/alterdekim/javabot/Application.java
Normal file
@ -0,0 +1,25 @@
|
|||||||
|
package com.alterdekim.javabot;
|
||||||
|
|
||||||
|
import com.alterdekim.javabot.storage.StorageService;
|
||||||
|
import org.springframework.boot.CommandLineRunner;
|
||||||
|
import org.springframework.boot.SpringApplication;
|
||||||
|
import org.springframework.boot.autoconfigure.SpringBootApplication;
|
||||||
|
import org.springframework.context.annotation.Bean;
|
||||||
|
import org.springframework.scheduling.annotation.EnableScheduling;
|
||||||
|
|
||||||
|
|
||||||
|
@SpringBootApplication
|
||||||
|
@EnableScheduling
|
||||||
|
public class Application {
|
||||||
|
|
||||||
|
public static void main(String[] args) {
|
||||||
|
SpringApplication.run(Application.class, args);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Bean
|
||||||
|
CommandLineRunner init(StorageService storageService) {
|
||||||
|
return (args) -> {
|
||||||
|
storageService.init();
|
||||||
|
};
|
||||||
|
}
|
||||||
|
}
|
10
src/main/java/com/alterdekim/javabot/Commands.java
Normal file
10
src/main/java/com/alterdekim/javabot/Commands.java
Normal file
@ -0,0 +1,10 @@
|
|||||||
|
package com.alterdekim.javabot;
|
||||||
|
|
||||||
|
public interface Commands {
|
||||||
|
String SET_GROUP = "/setgroup";
|
||||||
|
String GET_INFO = "/info";
|
||||||
|
String STOP_GAME = "/stopgame";
|
||||||
|
String START_GAME = "/startgame";
|
||||||
|
String JOIN_GAME = "/join";
|
||||||
|
String HELP = "/help";
|
||||||
|
}
|
54
src/main/java/com/alterdekim/javabot/Constants.java
Normal file
54
src/main/java/com/alterdekim/javabot/Constants.java
Normal file
@ -0,0 +1,54 @@
|
|||||||
|
package com.alterdekim.javabot;
|
||||||
|
|
||||||
|
public interface Constants {
|
||||||
|
String REMOVE_PLAYER = "Игрок %s покидает бункер.";
|
||||||
|
String ENDVOTE = "Голосование окончено.";
|
||||||
|
String DRAW = "Ничья. Никто не уходит из игры.";
|
||||||
|
String GROUP_SET = "Чат выбран.";
|
||||||
|
String INTERRUPT_GAME = "Игра остановлена.";
|
||||||
|
String USER_VOTED = "%s проголосовал.";
|
||||||
|
String JOIN_GAME_BTN = "Присоединиться";
|
||||||
|
String START_GAME_MSG = "Набор игроков начат. Присоединяйтесь.";
|
||||||
|
String JOINED_THE_GAME = "%s добавлен(а) в игру. Всего игроков: %d";
|
||||||
|
String THANK_YOU = "Спасибо.";
|
||||||
|
String ALREADY_IN_GAME = "Ты уже в игре.";
|
||||||
|
String CANT_JOIN_NOT_STARTED = "Не могу добавить вас в игру, тк вы не разрешили вам писать сообщения.";
|
||||||
|
String HELP = "Help";
|
||||||
|
String START_GAME_BTN = "Начать игру";
|
||||||
|
String NOT_ADMIN_EXCEPTION = "Вы не администратор";
|
||||||
|
String ACCOUNT = "Ваша анкета:\nПол: %s (смертный: %s, мужчина: %s, женщина: %s)\nВозраст: %d\nПрофессия: %s (%s)\nБагаж: %s (%s)\nХобби: %s\nЗдоровье: %s (%s) %d%%, бесплоден: %s";
|
||||||
|
String TRUE = "да";
|
||||||
|
String FALSE = "нет";
|
||||||
|
String PLAYERS_LESS_THAN_ZERO = "Игроков должно быть больше, чем 1.";
|
||||||
|
String HOBBY_BTN = "Хобби";
|
||||||
|
String WORK_BTN = "Работа";
|
||||||
|
String HEALTH_BTN = "Здоровье";
|
||||||
|
String AGE_BTN = "Возраст";
|
||||||
|
String GENDER_BTN = "Гендер";
|
||||||
|
String LUGG_BTN = "Багаж";
|
||||||
|
String GENDER_MESAGE = "%s - пол: %s (смертный: %s, мужчина: %s, женщина: %s)";
|
||||||
|
String HEALTH_MESSAGE = "%s - здоровье: %s (%s) %d%%, бесплоден(а): %s";
|
||||||
|
String SHOW_TIME = "Время выбрать, какую часть анкеты показать в этом раунде?";
|
||||||
|
String AGE_MESSAGE = "%s - возраст: %d";
|
||||||
|
String HOBBY_MESSAGE = "%s - хобби: %s";
|
||||||
|
String WORK_MESSAGE = "%s - профессия: %s (%s)";
|
||||||
|
String LUGG_MESSAGE = "%s - багаж: %s (%s)";
|
||||||
|
String DAY_MESSAGE_UPPER = "Следующий раунд начался!\nВероятность выжить \uD83D\uDCC8: %d%% (увеличилась на %f%%)";
|
||||||
|
String PRESSED_NIGHT = "%s нажал(а)";
|
||||||
|
String DAY_MESSAGE_DOWN = "Следующий раунд начался!\nВероятность выжить \uD83D\uDCC9: %d%% (уменьшилась на %f%%)";
|
||||||
|
String DAY_MESSAGE = "Следующий раунд начался!\nВероятность выжить: %f%%";
|
||||||
|
String END_GAME = "Конец игры.\nВероятность выжить: %f%%";
|
||||||
|
String POLL_QUESTION = "Кто в бункер не идёт?";
|
||||||
|
|
||||||
|
String DEATHMATCH = "Deathmatch";
|
||||||
|
|
||||||
|
String PROBABILITY = "Обычная";
|
||||||
|
|
||||||
|
String WIN_MESSAGE = "Поздравляю! Победа за вами!\n%s";
|
||||||
|
|
||||||
|
String LOSE_MESSAGE = "Поздравляю! Вы проиграли!";
|
||||||
|
|
||||||
|
String INFO_MESSAGE = "Вот открытая информация о живых игроках\n";
|
||||||
|
|
||||||
|
String CANT_SEND_NOT_DAY = "Нельзя использовать эту команду во время перерыва.";
|
||||||
|
}
|
@ -0,0 +1,41 @@
|
|||||||
|
package com.alterdekim.javabot;
|
||||||
|
|
||||||
|
import com.alterdekim.javabot.storage.StorageFileNotFoundException;
|
||||||
|
import com.alterdekim.javabot.storage.StorageProperties;
|
||||||
|
import com.alterdekim.javabot.storage.StorageService;
|
||||||
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
|
import org.springframework.boot.context.properties.EnableConfigurationProperties;
|
||||||
|
import org.springframework.core.io.Resource;
|
||||||
|
import org.springframework.http.HttpHeaders;
|
||||||
|
import org.springframework.http.MediaType;
|
||||||
|
import org.springframework.http.ResponseEntity;
|
||||||
|
import org.springframework.stereotype.Controller;
|
||||||
|
import org.springframework.web.bind.annotation.ExceptionHandler;
|
||||||
|
import org.springframework.web.bind.annotation.GetMapping;
|
||||||
|
import org.springframework.web.bind.annotation.PathVariable;
|
||||||
|
import org.springframework.web.bind.annotation.ResponseBody;
|
||||||
|
|
||||||
|
@Controller
|
||||||
|
@EnableConfigurationProperties(StorageProperties.class)
|
||||||
|
public class FileServerController {
|
||||||
|
|
||||||
|
private final StorageService storageService;
|
||||||
|
|
||||||
|
@Autowired
|
||||||
|
public FileServerController(StorageService storageService) {
|
||||||
|
this.storageService = storageService;
|
||||||
|
}
|
||||||
|
|
||||||
|
@GetMapping("/static/{assetspath}/{filename:.+}")
|
||||||
|
@ResponseBody
|
||||||
|
public ResponseEntity<Resource> serveFile(@PathVariable String filename, @PathVariable String assetspath) {
|
||||||
|
Resource file = storageService.loadAsResource("static/" + assetspath + "/" + filename);
|
||||||
|
return ResponseEntity.ok().contentType(new MediaType("text", assetspath)).header(HttpHeaders.CONTENT_DISPOSITION,
|
||||||
|
"attachment; filename=\"" + file.getFilename() + "\"").body(file);
|
||||||
|
}
|
||||||
|
|
||||||
|
@ExceptionHandler(StorageFileNotFoundException.class)
|
||||||
|
public ResponseEntity<?> handleStorageFileNotFound(StorageFileNotFoundException exc) {
|
||||||
|
return ResponseEntity.notFound().build();
|
||||||
|
}
|
||||||
|
}
|
28
src/main/java/com/alterdekim/javabot/Initializer.java
Normal file
28
src/main/java/com/alterdekim/javabot/Initializer.java
Normal file
@ -0,0 +1,28 @@
|
|||||||
|
package com.alterdekim.javabot;
|
||||||
|
|
||||||
|
import com.alterdekim.javabot.components.BunkerBot;
|
||||||
|
import lombok.extern.slf4j.Slf4j;
|
||||||
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
|
import org.springframework.context.event.ContextRefreshedEvent;
|
||||||
|
import org.springframework.context.event.EventListener;
|
||||||
|
import org.springframework.stereotype.Component;
|
||||||
|
import org.telegram.telegrambots.meta.TelegramBotsApi;
|
||||||
|
import org.telegram.telegrambots.meta.exceptions.TelegramApiException;
|
||||||
|
import org.telegram.telegrambots.updatesreceivers.DefaultBotSession;
|
||||||
|
|
||||||
|
@Component
|
||||||
|
@Slf4j
|
||||||
|
public class Initializer {
|
||||||
|
@Autowired
|
||||||
|
BunkerBot bot;
|
||||||
|
|
||||||
|
@EventListener({ContextRefreshedEvent.class})
|
||||||
|
public void init() {
|
||||||
|
try {
|
||||||
|
TelegramBotsApi telegramBotsApi = new TelegramBotsApi(DefaultBotSession.class);
|
||||||
|
telegramBotsApi.registerBot(bot);
|
||||||
|
} catch (TelegramApiException e) {
|
||||||
|
log.error(e.getMessage());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
41
src/main/java/com/alterdekim/javabot/MvcConfig.java
Normal file
41
src/main/java/com/alterdekim/javabot/MvcConfig.java
Normal file
@ -0,0 +1,41 @@
|
|||||||
|
package com.alterdekim.javabot;
|
||||||
|
|
||||||
|
import org.springframework.context.annotation.Bean;
|
||||||
|
import org.springframework.context.annotation.Configuration;
|
||||||
|
import org.springframework.web.servlet.LocaleResolver;
|
||||||
|
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
|
||||||
|
import org.springframework.web.servlet.config.annotation.ViewControllerRegistry;
|
||||||
|
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
|
||||||
|
import org.springframework.web.servlet.i18n.LocaleChangeInterceptor;
|
||||||
|
import org.springframework.web.servlet.i18n.SessionLocaleResolver;
|
||||||
|
|
||||||
|
import java.util.Locale;
|
||||||
|
|
||||||
|
@Configuration
|
||||||
|
public class MvcConfig implements WebMvcConfigurer {
|
||||||
|
public void addViewControllers(ViewControllerRegistry registry) {
|
||||||
|
registry.addViewController("/signup").setViewName("signup");
|
||||||
|
registry.addViewController("/login").setViewName("login");
|
||||||
|
registry.addViewController("/panel").setViewName("panel");
|
||||||
|
registry.addRedirectViewController("/", "/panel");
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void addInterceptors(InterceptorRegistry registry) {
|
||||||
|
registry.addInterceptor(localeChangeInterceptor());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Bean
|
||||||
|
public LocaleChangeInterceptor localeChangeInterceptor() {
|
||||||
|
LocaleChangeInterceptor lci = new LocaleChangeInterceptor();
|
||||||
|
lci.setParamName("lang");
|
||||||
|
return lci;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Bean
|
||||||
|
public LocaleResolver localeResolver() {
|
||||||
|
SessionLocaleResolver slr = new SessionLocaleResolver();
|
||||||
|
slr.setDefaultLocale(Locale.US);
|
||||||
|
return slr;
|
||||||
|
}
|
||||||
|
}
|
16
src/main/java/com/alterdekim/javabot/TelegramConfig.java
Normal file
16
src/main/java/com/alterdekim/javabot/TelegramConfig.java
Normal file
@ -0,0 +1,16 @@
|
|||||||
|
package com.alterdekim.javabot;
|
||||||
|
|
||||||
|
import lombok.Data;
|
||||||
|
import org.springframework.beans.factory.annotation.Value;
|
||||||
|
import org.springframework.context.annotation.Configuration;
|
||||||
|
import org.springframework.context.annotation.PropertySource;
|
||||||
|
|
||||||
|
|
||||||
|
@Data
|
||||||
|
@Configuration
|
||||||
|
@PropertySource("file:./telegram.properties") // classpath:/telegram.properties
|
||||||
|
public class TelegramConfig {
|
||||||
|
@Value("${bot.botToken}") private String botToken;
|
||||||
|
@Value("${bot.botLogin}") private String botLogin;
|
||||||
|
@Value("${bot.master}") private String masterId;
|
||||||
|
}
|
@ -0,0 +1,30 @@
|
|||||||
|
package com.alterdekim.javabot.bot;
|
||||||
|
|
||||||
|
import com.alterdekim.javabot.Constants;
|
||||||
|
import com.alterdekim.javabot.service.TextDataValService;
|
||||||
|
|
||||||
|
public class BotAccountProfileGenerator {
|
||||||
|
|
||||||
|
public static String build(TextDataValService textDataValService, Player p) {
|
||||||
|
return String.format(Constants.ACCOUNT,
|
||||||
|
getStringById(textDataValService, p.getGender().getGenderTextId()),
|
||||||
|
p.getGender().getCanDie() ? Constants.TRUE : Constants.FALSE,
|
||||||
|
p.getGender().getIsMale() ? Constants.TRUE : Constants.FALSE,
|
||||||
|
p.getGender().getIsFemale() ? Constants.TRUE : Constants.FALSE,
|
||||||
|
p.getAge(),
|
||||||
|
getStringById(textDataValService, p.getWork().getTextNameId()),
|
||||||
|
getStringById(textDataValService, p.getWork().getTextDescId()),
|
||||||
|
getStringById(textDataValService, p.getLuggage().getTextNameId()),
|
||||||
|
getStringById(textDataValService, p.getLuggage().getTextDescId()),
|
||||||
|
getStringById(textDataValService, p.getHobby().getTextDescId()),
|
||||||
|
getStringById(textDataValService, p.getHealth().getTextNameId()),
|
||||||
|
getStringById(textDataValService, p.getHealth().getTextDescId()),
|
||||||
|
(int) (p.getHealth().getHealth_index()*100f),
|
||||||
|
p.getHealth().getIsChildfree() ? Constants.TRUE : Constants.FALSE
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
private static String getStringById(TextDataValService textDataValService, Long id) {
|
||||||
|
return textDataValService.getTextDataValById(id).getText();
|
||||||
|
}
|
||||||
|
}
|
31
src/main/java/com/alterdekim/javabot/bot/DayNightFields.java
Normal file
31
src/main/java/com/alterdekim/javabot/bot/DayNightFields.java
Normal file
@ -0,0 +1,31 @@
|
|||||||
|
package com.alterdekim.javabot.bot;
|
||||||
|
|
||||||
|
import lombok.Getter;
|
||||||
|
import lombok.Setter;
|
||||||
|
|
||||||
|
import java.util.HashMap;
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
|
@Getter
|
||||||
|
@Setter
|
||||||
|
public class DayNightFields {
|
||||||
|
private Boolean isNight;
|
||||||
|
private Integer nightToken;
|
||||||
|
private String lastPollId;
|
||||||
|
private Map<Integer, Integer> poll;
|
||||||
|
private String dayMessage;
|
||||||
|
private Integer turnCount;
|
||||||
|
|
||||||
|
public DayNightFields() {
|
||||||
|
this.isNight = false;
|
||||||
|
this.nightToken = 0;
|
||||||
|
this.lastPollId = "";
|
||||||
|
this.poll = new HashMap<>();
|
||||||
|
this.dayMessage = "";
|
||||||
|
this.turnCount = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void appendMessage(String s) {
|
||||||
|
this.dayMessage += s;
|
||||||
|
}
|
||||||
|
}
|
24
src/main/java/com/alterdekim/javabot/bot/InfoSections.java
Normal file
24
src/main/java/com/alterdekim/javabot/bot/InfoSections.java
Normal file
@ -0,0 +1,24 @@
|
|||||||
|
package com.alterdekim.javabot.bot;
|
||||||
|
|
||||||
|
import lombok.Getter;
|
||||||
|
import lombok.Setter;
|
||||||
|
|
||||||
|
@Getter
|
||||||
|
@Setter
|
||||||
|
public class InfoSections {
|
||||||
|
private Boolean isGenderShowed;
|
||||||
|
private Boolean isAgeShowed;
|
||||||
|
private Boolean isWorkShowed;
|
||||||
|
private Boolean isLuggageShowed;
|
||||||
|
private Boolean isHobbyShowed;
|
||||||
|
private Boolean isHealthShowed;
|
||||||
|
|
||||||
|
public InfoSections() {
|
||||||
|
this.isAgeShowed = false;
|
||||||
|
this.isLuggageShowed = false;
|
||||||
|
this.isGenderShowed = false;
|
||||||
|
this.isWorkShowed = false;
|
||||||
|
this.isHealthShowed = false;
|
||||||
|
this.isHobbyShowed = false;
|
||||||
|
}
|
||||||
|
}
|
81
src/main/java/com/alterdekim/javabot/bot/LiveFormula.java
Normal file
81
src/main/java/com/alterdekim/javabot/bot/LiveFormula.java
Normal file
@ -0,0 +1,81 @@
|
|||||||
|
package com.alterdekim.javabot.bot;
|
||||||
|
|
||||||
|
import com.alterdekim.javabot.entities.ColumnType;
|
||||||
|
import com.alterdekim.javabot.entities.Synergy;
|
||||||
|
import com.alterdekim.javabot.util.Clamp;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
public class LiveFormula {
|
||||||
|
public static double calc(List<Player> playerList, List<Synergy> synergies) {
|
||||||
|
double i = 0;
|
||||||
|
for( Player p : playerList ) {
|
||||||
|
double age = 1.0D - (((double) p.getAge()) / 75.0D);
|
||||||
|
age = p.getGender().getCanDie() ? age : 1.0D;
|
||||||
|
double gender = p.getGender().getIsMale() ? 1 : 0;
|
||||||
|
gender += p.getGender().getIsFemale() ? 1 : 0;
|
||||||
|
gender = p.getHealth().getIsChildfree() ? 0 : gender;
|
||||||
|
gender *= 0.5D;
|
||||||
|
double work = p.getWork().getValue();
|
||||||
|
double luggage = p.getLuggage().getValue();
|
||||||
|
luggage = p.getLuggage().getGarbage() ? 0 : luggage;
|
||||||
|
double hobby = p.getHobby().getValue();
|
||||||
|
double health = p.getHealth().getHealth_index().doubleValue();
|
||||||
|
i += ((age + gender + work + luggage + hobby + health) / 6.0d);
|
||||||
|
}
|
||||||
|
i = i / ((double) playerList.size());
|
||||||
|
double _i = i;
|
||||||
|
if( playerList.stream().anyMatch(t -> (t.getGender().getIsMale() && !t.getHealth().getIsChildfree())) &&
|
||||||
|
playerList.stream().anyMatch(t -> (t.getGender().getIsFemale() && !t.getHealth().getIsChildfree())) ) {
|
||||||
|
i += 0.3 * _i;
|
||||||
|
}
|
||||||
|
for( Synergy s : synergies ) {
|
||||||
|
Boolean fb = LiveFormula.entity(playerList, s.getFirstType(), s.getFirstEntityId());
|
||||||
|
Boolean eb = LiveFormula.entity(playerList, s.getSecondType(), s.getSecondEntityId());
|
||||||
|
if( fb && eb ) i += s.getProbabilityValue().doubleValue() * _i;
|
||||||
|
}
|
||||||
|
return Clamp.clamp(i * 1.2d, 0, 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
private static Boolean entity(List<Player> players, ColumnType ct, Long eid) {
|
||||||
|
Boolean fb = false;
|
||||||
|
switch (ct) {
|
||||||
|
case Bio:
|
||||||
|
fb = LiveFormula.searchForBio(players, eid);
|
||||||
|
break;
|
||||||
|
case Work:
|
||||||
|
fb = LiveFormula.searchForWork(players, eid);
|
||||||
|
break;
|
||||||
|
case Hobby:
|
||||||
|
fb = LiveFormula.searchForHobby(players, eid);
|
||||||
|
break;
|
||||||
|
case Health:
|
||||||
|
fb = LiveFormula.searchForHealth(players, eid);
|
||||||
|
break;
|
||||||
|
case Luggage:
|
||||||
|
fb = LiveFormula.searchForLuggage(players, eid);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
return fb;
|
||||||
|
}
|
||||||
|
|
||||||
|
private static Boolean searchForBio(List<Player> players, Long id) {
|
||||||
|
return players.stream().anyMatch(p -> p.getGender().getId().equals(id));
|
||||||
|
}
|
||||||
|
|
||||||
|
private static Boolean searchForWork(List<Player> players, Long id) {
|
||||||
|
return players.stream().anyMatch(p -> p.getWork().getId().equals(id));
|
||||||
|
}
|
||||||
|
|
||||||
|
private static Boolean searchForHobby(List<Player> players, Long id) {
|
||||||
|
return players.stream().anyMatch(p -> p.getHobby().getId().equals(id));
|
||||||
|
}
|
||||||
|
|
||||||
|
private static Boolean searchForHealth(List<Player> players, Long id) {
|
||||||
|
return players.stream().anyMatch(p -> p.getHealth().getId().equals(id));
|
||||||
|
}
|
||||||
|
|
||||||
|
private static Boolean searchForLuggage(List<Player> players, Long id) {
|
||||||
|
return players.stream().anyMatch(p -> p.getLuggage().getId().equals(id));
|
||||||
|
}
|
||||||
|
}
|
29
src/main/java/com/alterdekim/javabot/bot/Player.java
Normal file
29
src/main/java/com/alterdekim/javabot/bot/Player.java
Normal file
@ -0,0 +1,29 @@
|
|||||||
|
package com.alterdekim.javabot.bot;
|
||||||
|
|
||||||
|
import com.alterdekim.javabot.entities.*;
|
||||||
|
import lombok.AllArgsConstructor;
|
||||||
|
import lombok.Getter;
|
||||||
|
import lombok.Setter;
|
||||||
|
|
||||||
|
@Getter
|
||||||
|
@Setter
|
||||||
|
@AllArgsConstructor
|
||||||
|
public class Player {
|
||||||
|
private Long telegramId;
|
||||||
|
private int age;
|
||||||
|
private Bio gender;
|
||||||
|
private Health health;
|
||||||
|
private Hobby hobby;
|
||||||
|
private Work work;
|
||||||
|
private Luggage luggage;
|
||||||
|
private Boolean isAnswered = false;
|
||||||
|
private String firstName;
|
||||||
|
private InfoSections infoSections;
|
||||||
|
private Boolean isVoted = false;
|
||||||
|
|
||||||
|
public Player(Long telegramId, String name) {
|
||||||
|
this.telegramId = telegramId;
|
||||||
|
this.firstName = name;
|
||||||
|
this.infoSections = new InfoSections();
|
||||||
|
}
|
||||||
|
}
|
513
src/main/java/com/alterdekim/javabot/components/BunkerBot.java
Normal file
513
src/main/java/com/alterdekim/javabot/components/BunkerBot.java
Normal file
@ -0,0 +1,513 @@
|
|||||||
|
package com.alterdekim.javabot.components;
|
||||||
|
|
||||||
|
import com.alterdekim.javabot.bot.*;
|
||||||
|
import com.alterdekim.javabot.Commands;
|
||||||
|
import com.alterdekim.javabot.Constants;
|
||||||
|
import com.alterdekim.javabot.TelegramConfig;
|
||||||
|
import com.alterdekim.javabot.entities.*;
|
||||||
|
import com.alterdekim.javabot.service.*;
|
||||||
|
import com.alterdekim.javabot.util.BotUtils;
|
||||||
|
import com.alterdekim.javabot.util.GameState;
|
||||||
|
import com.alterdekim.javabot.util.HashUtils;
|
||||||
|
import jakarta.validation.constraints.NotNull;
|
||||||
|
import lombok.extern.slf4j.Slf4j;
|
||||||
|
import org.springframework.scheduling.annotation.Scheduled;
|
||||||
|
import org.springframework.stereotype.Component;
|
||||||
|
import org.telegram.telegrambots.bots.TelegramLongPollingBot;
|
||||||
|
import org.telegram.telegrambots.meta.api.methods.AnswerCallbackQuery;
|
||||||
|
import org.telegram.telegrambots.meta.api.methods.BotApiMethod;
|
||||||
|
import org.telegram.telegrambots.meta.api.methods.groupadministration.GetChatMember;
|
||||||
|
import org.telegram.telegrambots.meta.api.methods.polls.SendPoll;
|
||||||
|
import org.telegram.telegrambots.meta.api.methods.send.SendMessage;
|
||||||
|
import org.telegram.telegrambots.meta.api.methods.updatingmessages.DeleteMessage;
|
||||||
|
import org.telegram.telegrambots.meta.api.objects.CallbackQuery;
|
||||||
|
import org.telegram.telegrambots.meta.api.objects.Message;
|
||||||
|
import org.telegram.telegrambots.meta.api.objects.Update;
|
||||||
|
import org.telegram.telegrambots.meta.api.objects.User;
|
||||||
|
import org.telegram.telegrambots.meta.api.objects.chatmember.ChatMember;
|
||||||
|
import org.telegram.telegrambots.meta.exceptions.TelegramApiException;
|
||||||
|
|
||||||
|
import java.io.Serializable;
|
||||||
|
import java.util.*;
|
||||||
|
import java.util.concurrent.*;
|
||||||
|
import java.util.stream.Collectors;
|
||||||
|
|
||||||
|
@Component
|
||||||
|
@Slf4j
|
||||||
|
public class BunkerBot extends TelegramLongPollingBot {
|
||||||
|
private final TelegramConfig telegramConfig;
|
||||||
|
private String groupId = "";
|
||||||
|
|
||||||
|
private GameState gameState;
|
||||||
|
|
||||||
|
private double last_p = -1;
|
||||||
|
|
||||||
|
private List<Player> players;
|
||||||
|
|
||||||
|
private final BioService bioService;
|
||||||
|
private final HealthService healthService;
|
||||||
|
private final HobbyService hobbyService;
|
||||||
|
private final LuggageService luggageService;
|
||||||
|
private final WorkService workService;
|
||||||
|
private final TextDataValService textDataValService;
|
||||||
|
private final DisasterService disasterService;
|
||||||
|
private final SynergyService synergyService;
|
||||||
|
|
||||||
|
private final Random random;
|
||||||
|
|
||||||
|
private DayNightFields dayNightFields;
|
||||||
|
|
||||||
|
private ConcurrentLinkedQueue<BotApiMethod<? extends Serializable>> linkedQueue;
|
||||||
|
|
||||||
|
@SuppressWarnings("deprecation")
|
||||||
|
public BunkerBot(TelegramConfig telegramConfig,
|
||||||
|
BioService bioService,
|
||||||
|
HealthService healthService,
|
||||||
|
HobbyService hobbyService,
|
||||||
|
LuggageService luggageService,
|
||||||
|
WorkService workService,
|
||||||
|
TextDataValService textDataValService,
|
||||||
|
DisasterService disasterService,
|
||||||
|
SynergyService synergyService) {
|
||||||
|
this.telegramConfig = telegramConfig;
|
||||||
|
this.players = new ArrayList<>();
|
||||||
|
this.gameState = GameState.NONE;
|
||||||
|
this.bioService = bioService;
|
||||||
|
this.healthService = healthService;
|
||||||
|
this.hobbyService = hobbyService;
|
||||||
|
this.luggageService = luggageService;
|
||||||
|
this.workService = workService;
|
||||||
|
this.textDataValService = textDataValService;
|
||||||
|
this.disasterService = disasterService;
|
||||||
|
this.synergyService = synergyService;
|
||||||
|
this.random = new Random();
|
||||||
|
this.dayNightFields = new DayNightFields();
|
||||||
|
this.linkedQueue = new ConcurrentLinkedQueue<>();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Scheduled(fixedRate = 100)
|
||||||
|
private void executeApi() {
|
||||||
|
if( !this.linkedQueue.isEmpty() )
|
||||||
|
sendApiMethodAsync(this.linkedQueue.poll());
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String getBotUsername() {
|
||||||
|
return telegramConfig.getBotLogin();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
@SuppressWarnings("deprecation")
|
||||||
|
public String getBotToken() {
|
||||||
|
return telegramConfig.getBotToken();
|
||||||
|
}
|
||||||
|
|
||||||
|
private Long getMasterId() {
|
||||||
|
return Long.parseLong(telegramConfig.getMasterId());
|
||||||
|
}
|
||||||
|
|
||||||
|
private void joinGame(User user, Integer msgid) {
|
||||||
|
if( gameState != GameState.JOINING )
|
||||||
|
return;
|
||||||
|
|
||||||
|
if( !hasPlayerWithId(user.getId()) ) {
|
||||||
|
if( canWrite(user) ) {
|
||||||
|
this.players.add(new Player(user.getId(), user.getFirstName()));
|
||||||
|
sendApi(
|
||||||
|
new SendMessage(
|
||||||
|
groupId,
|
||||||
|
String.format(
|
||||||
|
Constants.JOINED_THE_GAME,
|
||||||
|
user.getFirstName(),
|
||||||
|
players.size()
|
||||||
|
)
|
||||||
|
)
|
||||||
|
);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if( msgid != 0 ) {
|
||||||
|
SendMessage sm = new SendMessage(groupId, Constants.CANT_JOIN_NOT_STARTED);
|
||||||
|
sm.setReplyToMessageId(msgid);
|
||||||
|
sendApi(sm);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
SendMessage sm = new SendMessage(groupId, BotUtils.mentionUser(user.getUserName()) + Constants.CANT_JOIN_NOT_STARTED);
|
||||||
|
sendApi(sm);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
sendApi(
|
||||||
|
new SendMessage(
|
||||||
|
groupId,
|
||||||
|
Constants.ALREADY_IN_GAME
|
||||||
|
)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
private Boolean canWrite(User u) {
|
||||||
|
SendMessage message = new SendMessage(u.getId()+"", ".");
|
||||||
|
message.disableNotification();
|
||||||
|
Message mr;
|
||||||
|
try {
|
||||||
|
mr = sendApiMethod(message);
|
||||||
|
} catch ( Exception e ) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
sendApi(new DeleteMessage(u.getId()+"", mr.getMessageId()));
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
private Boolean isAdmin(User u) {
|
||||||
|
GetChatMember chatMember = new GetChatMember(groupId, u.getId());
|
||||||
|
try {
|
||||||
|
ChatMember cm = sendApiMethod(chatMember);
|
||||||
|
return cm.getStatus().equals("creator") || cm.getStatus().startsWith("admin");
|
||||||
|
} catch (Exception e) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void startGame() {
|
||||||
|
if( gameState != GameState.JOINING )
|
||||||
|
return;
|
||||||
|
if(players.size() < 2) {
|
||||||
|
sendApi(new SendMessage(groupId, Constants.PLAYERS_LESS_THAN_ZERO));
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
this.gameState = GameState.STARTED;
|
||||||
|
Disaster d = (Disaster) BotUtils.getRandomFromList(disasterService.getAllDisasters(), random);
|
||||||
|
sendApi(new SendMessage(groupId, getStringById(d.getDescTextId())));
|
||||||
|
List<Bio> bios = bioService.getAllBios();
|
||||||
|
List<Work> works = workService.getAllWorks();
|
||||||
|
List<Luggage> luggs = luggageService.getAllLuggages();
|
||||||
|
List<Hobby> hobbies = hobbyService.getAllHobbies();
|
||||||
|
List<Health> healths = healthService.getAllHealth();
|
||||||
|
for( Player p : players ) {
|
||||||
|
p.setAge(random.nextInt(57)+18);
|
||||||
|
p.setGender((Bio) BotUtils.getRandomFromList(bios, random));
|
||||||
|
p.setWork((Work) BotUtils.getRandomFromList(works, random));
|
||||||
|
p.setLuggage((Luggage) BotUtils.getRandomFromList(luggs, random));
|
||||||
|
p.setHobby((Hobby) BotUtils.getRandomFromList(hobbies, random));
|
||||||
|
p.setHealth((Health) BotUtils.getRandomFromList(healths, random));
|
||||||
|
|
||||||
|
SendMessage sendMessage = new SendMessage(p.getTelegramId()+"", BotAccountProfileGenerator.build(textDataValService, p));
|
||||||
|
sendApi(sendMessage);
|
||||||
|
}
|
||||||
|
doNight();
|
||||||
|
}
|
||||||
|
|
||||||
|
private void doNight() {
|
||||||
|
this.dayNightFields.setIsNight(true);
|
||||||
|
this.dayNightFields.setNightToken(random.nextInt(1000)+10);
|
||||||
|
this.dayNightFields.setPoll(new HashMap<>());
|
||||||
|
this.dayNightFields.setTurnCount(this.dayNightFields.getTurnCount()+1);
|
||||||
|
for( Player p : players ) {
|
||||||
|
SendMessage sendMessage = new SendMessage(p.getTelegramId()+"", Constants.SHOW_TIME);
|
||||||
|
sendMessage.setReplyMarkup(BotUtils.getShowKeyboard(p.getInfoSections()));
|
||||||
|
sendApi(sendMessage);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private String getStringById(Long id) {
|
||||||
|
return textDataValService.getTextDataValById(id).getText();
|
||||||
|
}
|
||||||
|
|
||||||
|
private void processNightButton(CallbackQuery callbackQuery) {
|
||||||
|
if( this.hasPlayerWithId(callbackQuery.getFrom().getId()) &&
|
||||||
|
!getPlayerById(callbackQuery.getFrom().getId()).getIsAnswered() ) {
|
||||||
|
Player p = getPlayerById(callbackQuery.getFrom().getId());
|
||||||
|
InfoSections ins = p.getInfoSections();
|
||||||
|
switch (new String(HashUtils.decodeHexString(callbackQuery.getData()))) {
|
||||||
|
case Constants.GENDER_BTN:
|
||||||
|
dayNightFields.appendMessage(String.format(Constants.GENDER_MESAGE, callbackQuery.getFrom().getFirstName(), getStringById(p.getGender().getGenderTextId()),
|
||||||
|
p.getGender().getCanDie() ? Constants.TRUE : Constants.FALSE,
|
||||||
|
p.getGender().getIsMale() ? Constants.TRUE : Constants.FALSE,
|
||||||
|
p.getGender().getIsFemale() ? Constants.TRUE : Constants.FALSE) + "\n");
|
||||||
|
ins.setIsGenderShowed(true);
|
||||||
|
break;
|
||||||
|
case Constants.HEALTH_BTN:
|
||||||
|
dayNightFields.appendMessage(String.format(Constants.HEALTH_MESSAGE, callbackQuery.getFrom().getFirstName(), getStringById(p.getHealth().getTextNameId()),
|
||||||
|
getStringById(p.getHealth().getTextDescId()),
|
||||||
|
(int) (p.getHealth().getHealth_index()*100f),
|
||||||
|
p.getHealth().getIsChildfree() ? Constants.TRUE : Constants.FALSE) + "\n");
|
||||||
|
ins.setIsHealthShowed(true);
|
||||||
|
break;
|
||||||
|
case Constants.AGE_BTN:
|
||||||
|
dayNightFields.appendMessage(String.format(Constants.AGE_MESSAGE, callbackQuery.getFrom().getFirstName(), p.getAge()) + "\n");
|
||||||
|
ins.setIsAgeShowed(true);
|
||||||
|
break;
|
||||||
|
case Constants.HOBBY_BTN:
|
||||||
|
dayNightFields.appendMessage(String.format(Constants.HOBBY_MESSAGE, callbackQuery.getFrom().getFirstName(),
|
||||||
|
getStringById(p.getHobby().getTextDescId())) + "\n");
|
||||||
|
ins.setIsHobbyShowed(true);
|
||||||
|
break;
|
||||||
|
case Constants.LUGG_BTN:
|
||||||
|
dayNightFields.appendMessage(String.format(Constants.LUGG_MESSAGE, callbackQuery.getFrom().getFirstName(),
|
||||||
|
getStringById(p.getLuggage().getTextNameId()),
|
||||||
|
getStringById(p.getLuggage().getTextDescId())) + "\n");
|
||||||
|
ins.setIsLuggageShowed(true);
|
||||||
|
break;
|
||||||
|
case Constants.WORK_BTN:
|
||||||
|
dayNightFields.appendMessage(String.format(Constants.WORK_MESSAGE, callbackQuery.getFrom().getFirstName(),
|
||||||
|
getStringById(p.getWork().getTextNameId()),
|
||||||
|
getStringById(p.getWork().getTextDescId())) + "\n");
|
||||||
|
ins.setIsWorkShowed(true);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
setIsAnswered(callbackQuery.getFrom().getId());
|
||||||
|
updateInfoSections(p, ins);
|
||||||
|
sendApi(new SendMessage(callbackQuery.getMessage().getChatId()+"", Constants.THANK_YOU));
|
||||||
|
sendApi(new DeleteMessage(callbackQuery.getMessage().getChatId()+"", callbackQuery.getMessage().getMessageId()));
|
||||||
|
sendApi(new SendMessage(groupId, String.format(Constants.PRESSED_NIGHT, callbackQuery.getFrom().getFirstName())));
|
||||||
|
if( isAllAnswered() ) doDay();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void sendApi(BotApiMethod<? extends Serializable> method) {
|
||||||
|
this.linkedQueue.add(method);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void updateInfoSections(Player p1, InfoSections infoSections) {
|
||||||
|
players.stream().filter((p) -> p.equals(p1)).forEach((p) -> p.setInfoSections(infoSections));
|
||||||
|
}
|
||||||
|
|
||||||
|
private void setIsAnswered(Long id) {
|
||||||
|
players.stream().filter(p -> p.getTelegramId().equals(id) ).forEach(p -> p.setIsAnswered(true));
|
||||||
|
}
|
||||||
|
|
||||||
|
private void setIsVoted(Long id) {
|
||||||
|
players.stream().filter(p -> p.getTelegramId().equals(id) ).forEach(p -> p.setIsVoted(true));
|
||||||
|
}
|
||||||
|
|
||||||
|
private void doDay() {
|
||||||
|
dayNightFields.setIsNight(false);
|
||||||
|
double p = Math.floor(LiveFormula.calc(players, synergyService.getAllSynergies())*100d);
|
||||||
|
if( this.last_p < 0 ) { this.last_p = p; }
|
||||||
|
if( p > this.last_p ) {
|
||||||
|
sendApi(new SendMessage(groupId, String.format(Constants.DAY_MESSAGE_UPPER, (int) p, (p - this.last_p))));
|
||||||
|
} else if( p < this.last_p ) {
|
||||||
|
sendApi(new SendMessage(groupId, String.format(Constants.DAY_MESSAGE_DOWN, (int) p, (this.last_p - p))));
|
||||||
|
} else {
|
||||||
|
sendApi(new SendMessage(groupId, String.format(Constants.DAY_MESSAGE, p)));
|
||||||
|
}
|
||||||
|
this.last_p = p;
|
||||||
|
sendApi(new SendMessage(groupId, dayNightFields.getDayMessage()));
|
||||||
|
dayNightFields.setDayMessage("");
|
||||||
|
setAllNotAnswered();
|
||||||
|
setAllNotVoted();
|
||||||
|
SendPoll sp = new SendPoll(groupId, Constants.POLL_QUESTION, getAllUsers());
|
||||||
|
sp.setIsAnonymous(false);
|
||||||
|
sp.setAllowMultipleAnswers(false);
|
||||||
|
try {
|
||||||
|
dayNightFields.setLastPollId(sendApiMethod(sp).getPoll().getId());
|
||||||
|
} catch (TelegramApiException e) {
|
||||||
|
log.error(e.getMessage());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void setAllNotVoted() {
|
||||||
|
players.forEach((p) -> p.setIsVoted(false));
|
||||||
|
}
|
||||||
|
|
||||||
|
private Boolean isAllVoted() {
|
||||||
|
return players.stream().allMatch(Player::getIsVoted);
|
||||||
|
}
|
||||||
|
|
||||||
|
private List<String> getAllUsers() {
|
||||||
|
return players.stream().map(Player::getFirstName).collect(Collectors.toList());
|
||||||
|
}
|
||||||
|
|
||||||
|
private void setAllNotAnswered() {
|
||||||
|
players.forEach((p) -> p.setIsAnswered(false));
|
||||||
|
}
|
||||||
|
|
||||||
|
private Boolean isAllAnswered() {
|
||||||
|
return players.stream().allMatch(Player::getIsAnswered);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void showInfo() {
|
||||||
|
if( this.dayNightFields.getIsNight() ) {
|
||||||
|
sendApi(new SendMessage(groupId, Constants.CANT_SEND_NOT_DAY));
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
String message = Constants.INFO_MESSAGE;
|
||||||
|
for( Player p : players ) {
|
||||||
|
message += p.getFirstName() + ":\n";
|
||||||
|
InfoSections s = p.getInfoSections();
|
||||||
|
if(s.getIsGenderShowed()) {
|
||||||
|
message += String.format(Constants.GENDER_MESAGE, p.getFirstName(), getStringById(p.getGender().getGenderTextId()),
|
||||||
|
p.getGender().getCanDie() ? Constants.TRUE : Constants.FALSE,
|
||||||
|
p.getGender().getIsMale() ? Constants.TRUE : Constants.FALSE,
|
||||||
|
p.getGender().getIsFemale() ? Constants.TRUE : Constants.FALSE) + "\n";
|
||||||
|
}
|
||||||
|
if(s.getIsAgeShowed()) {
|
||||||
|
message += String.format(Constants.AGE_MESSAGE, p.getFirstName(), p.getAge()) + "\n";
|
||||||
|
}
|
||||||
|
if(s.getIsLuggageShowed()) {
|
||||||
|
message += String.format(Constants.LUGG_MESSAGE, p.getFirstName(),
|
||||||
|
getStringById(p.getLuggage().getTextNameId()),
|
||||||
|
getStringById(p.getLuggage().getTextDescId())) + "\n";
|
||||||
|
}
|
||||||
|
if(s.getIsHealthShowed()) {
|
||||||
|
message += String.format(Constants.HEALTH_MESSAGE, p.getFirstName(), getStringById(p.getHealth().getTextNameId()),
|
||||||
|
getStringById(p.getHealth().getTextDescId()),
|
||||||
|
(int) (p.getHealth().getHealth_index()*100f),
|
||||||
|
p.getHealth().getIsChildfree() ? Constants.TRUE : Constants.FALSE) + "\n";
|
||||||
|
}
|
||||||
|
if(s.getIsWorkShowed()) {
|
||||||
|
message += String.format(Constants.WORK_MESSAGE, p.getFirstName(),
|
||||||
|
getStringById(p.getWork().getTextNameId()),
|
||||||
|
getStringById(p.getWork().getTextDescId())) + "\n";
|
||||||
|
}
|
||||||
|
if(s.getIsHobbyShowed()) {
|
||||||
|
message += String.format(Constants.HOBBY_MESSAGE, p.getFirstName(),
|
||||||
|
getStringById(p.getHobby().getTextDescId())) + "\n";
|
||||||
|
}
|
||||||
|
message += "\n";
|
||||||
|
}
|
||||||
|
sendApi(new SendMessage(groupId, message));
|
||||||
|
}
|
||||||
|
|
||||||
|
private void endVote() {
|
||||||
|
Integer max = dayNightFields.getPoll().values().stream().max(Integer::compareTo).get();
|
||||||
|
long count = dayNightFields.getPoll().values().stream().filter(p -> p.equals(max)).count();
|
||||||
|
SendMessage sendMessage = new SendMessage(groupId, Constants.ENDVOTE);
|
||||||
|
if( count > 1 ) {
|
||||||
|
sendMessage = new SendMessage(groupId, Constants.DRAW);
|
||||||
|
} else {
|
||||||
|
removeVotePlayers(max);
|
||||||
|
}
|
||||||
|
sendApi(sendMessage);
|
||||||
|
if( !checkEndGame() ) {
|
||||||
|
doNight();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
endGame();
|
||||||
|
}
|
||||||
|
|
||||||
|
private Boolean checkEndGame() {
|
||||||
|
return players.size() < 2 || dayNightFields.getTurnCount() >= 6;
|
||||||
|
}
|
||||||
|
|
||||||
|
private void endGame() {
|
||||||
|
double d = Math.floor(LiveFormula.calc(players, synergyService.getAllSynergies())*100d);
|
||||||
|
sendApi(new SendMessage(groupId, String.format(Constants.END_GAME, d)));
|
||||||
|
if(!players.isEmpty() && Math.floor(random.nextDouble()*100d) <= d) {
|
||||||
|
sendApi(new SendMessage(groupId, String.format(Constants.WIN_MESSAGE,
|
||||||
|
players.stream().map(Player::getFirstName).collect(Collectors.joining(", "))
|
||||||
|
)));
|
||||||
|
} else {
|
||||||
|
sendApi(new SendMessage(groupId, Constants.LOSE_MESSAGE));
|
||||||
|
}
|
||||||
|
interruptGame();
|
||||||
|
}
|
||||||
|
|
||||||
|
private void removeVotePlayers(Integer max) {
|
||||||
|
dayNightFields.getPoll()
|
||||||
|
.entrySet()
|
||||||
|
.stream()
|
||||||
|
.filter(e -> e.getValue().equals(max))
|
||||||
|
.forEach(i -> {
|
||||||
|
sendApi(new SendMessage(groupId, String.format(Constants.REMOVE_PLAYER, players.get(i.getKey()).getFirstName())));
|
||||||
|
players.remove(i.getKey().intValue());
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
private void interruptGame() {
|
||||||
|
this.dayNightFields = new DayNightFields();
|
||||||
|
this.players = new ArrayList<>();
|
||||||
|
this.gameState = GameState.NONE;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onUpdateReceived(@NotNull Update update) {
|
||||||
|
if( update.hasPollAnswer() && update.getPollAnswer().getPollId().equals(dayNightFields.getLastPollId())
|
||||||
|
&& !dayNightFields.getIsNight() && !update.getPollAnswer().getOptionIds().isEmpty()) {
|
||||||
|
if( getPlayerById(update.getPollAnswer().getUser().getId()).getIsVoted() )
|
||||||
|
return;
|
||||||
|
if( dayNightFields.getPoll().containsKey(update.getPollAnswer().getOptionIds().get(0)) ) {
|
||||||
|
dayNightFields.getPoll().put(update.getPollAnswer().getOptionIds().get(0),
|
||||||
|
dayNightFields.getPoll().get(update.getPollAnswer().getOptionIds().get(0)) + 1);
|
||||||
|
} else {
|
||||||
|
dayNightFields.getPoll().put(update.getPollAnswer().getOptionIds().get(0), 1);
|
||||||
|
}
|
||||||
|
setIsVoted(update.getPollAnswer().getUser().getId());
|
||||||
|
sendApi(new SendMessage(groupId, String.format(Constants.USER_VOTED, update.getPollAnswer().getUser().getFirstName())));
|
||||||
|
if( isAllVoted() )
|
||||||
|
endVote();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if( update.hasCallbackQuery() ) {
|
||||||
|
sendApi(
|
||||||
|
new AnswerCallbackQuery(
|
||||||
|
update.getCallbackQuery().getId()
|
||||||
|
)
|
||||||
|
);
|
||||||
|
if( update.getCallbackQuery().getData().equals(HashUtils.bytesToHex(Constants.JOIN_GAME_BTN.getBytes())) ) {
|
||||||
|
joinGame(update.getCallbackQuery().getFrom(), 0);
|
||||||
|
} else if( update.getCallbackQuery().getData().equals(HashUtils.bytesToHex(Constants.START_GAME_BTN.getBytes())) ) {
|
||||||
|
if( isAdmin(update.getCallbackQuery().getFrom()) ) {
|
||||||
|
startGame();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
sendApi(new SendMessage(groupId, Constants.NOT_ADMIN_EXCEPTION));
|
||||||
|
} else if( gameState == GameState.STARTED && dayNightFields.getIsNight() ) {
|
||||||
|
processNightButton(update.getCallbackQuery());
|
||||||
|
}
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if( !(update.hasMessage() && update.getMessage().hasText() && update.getMessage().isCommand()) )
|
||||||
|
return;
|
||||||
|
|
||||||
|
String chatId = update.getMessage().getChatId()+"";
|
||||||
|
|
||||||
|
if( ( update.getMessage().getText().equals(Commands.SET_GROUP + "@" + getBotUsername()) ||
|
||||||
|
update.getMessage().getText().equals(Commands.SET_GROUP)) &&
|
||||||
|
update.getMessage().getFrom().getId().equals(getMasterId()) && gameState == GameState.NONE) {
|
||||||
|
groupId = chatId;
|
||||||
|
sendApi(new SendMessage(chatId, Constants.GROUP_SET));
|
||||||
|
}
|
||||||
|
|
||||||
|
if( !chatId.equals(groupId) )
|
||||||
|
return;
|
||||||
|
|
||||||
|
if ( (update.getMessage().getText().equals(Commands.START_GAME + "@" + getBotUsername()) ||
|
||||||
|
update.getMessage().getText().equals(Commands.START_GAME) ) &&
|
||||||
|
gameState == GameState.NONE) {
|
||||||
|
SendMessage message = new SendMessage(chatId, Constants.START_GAME_MSG);
|
||||||
|
message.setReplyMarkup(BotUtils.getJoinKeyboard());
|
||||||
|
sendApi(message);
|
||||||
|
gameState = GameState.JOINING;
|
||||||
|
} else if (update.getMessage().getText().equals(Commands.JOIN_GAME + "@" + getBotUsername()) ||
|
||||||
|
update.getMessage().getText().equals(Commands.JOIN_GAME)) {
|
||||||
|
joinGame(update.getMessage().getFrom(), update.getMessage().getMessageId());
|
||||||
|
} else if (update.getMessage().getText().equals(Commands.HELP + "@" + getBotUsername()) ||
|
||||||
|
update.getMessage().getText().equals(Commands.HELP)) {
|
||||||
|
sendApi(new SendMessage(chatId, Constants.HELP));
|
||||||
|
} else if ((update.getMessage().getText().equals(Commands.STOP_GAME + "@" + getBotUsername()) ||
|
||||||
|
update.getMessage().getText().equals(Commands.STOP_GAME) ) &&
|
||||||
|
gameState != GameState.NONE) {
|
||||||
|
if( isAdmin(update.getMessage().getFrom()) ) {
|
||||||
|
sendApi(new SendMessage(groupId, Constants.INTERRUPT_GAME));
|
||||||
|
interruptGame();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
sendApi(new SendMessage(groupId, Constants.NOT_ADMIN_EXCEPTION));
|
||||||
|
} else if((update.getMessage().getText().equals(Commands.GET_INFO + "@" + getBotUsername()) ||
|
||||||
|
update.getMessage().getText().equals(Commands.GET_INFO) ) &&
|
||||||
|
gameState == GameState.STARTED) {
|
||||||
|
showInfo();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private Player getPlayerById(Long id) {
|
||||||
|
return players.stream().filter((p) -> p.getTelegramId().equals(id) ).findFirst().orElse(null);
|
||||||
|
}
|
||||||
|
|
||||||
|
private Boolean hasPlayerWithId(Long id) {
|
||||||
|
return players.stream().anyMatch((p) -> p.getTelegramId().equals(id));
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,75 @@
|
|||||||
|
package com.alterdekim.javabot.controller;
|
||||||
|
|
||||||
|
import com.alterdekim.javabot.dto.UserDTO;
|
||||||
|
import com.alterdekim.javabot.entities.Invite;
|
||||||
|
import com.alterdekim.javabot.entities.User;
|
||||||
|
import com.alterdekim.javabot.service.InviteService;
|
||||||
|
import com.alterdekim.javabot.service.UserService;
|
||||||
|
import jakarta.validation.Valid;
|
||||||
|
import lombok.extern.slf4j.Slf4j;
|
||||||
|
import org.springframework.stereotype.Controller;
|
||||||
|
import org.springframework.ui.Model;
|
||||||
|
import org.springframework.validation.BindingResult;
|
||||||
|
import org.springframework.web.bind.annotation.*;
|
||||||
|
|
||||||
|
@Slf4j
|
||||||
|
@Controller
|
||||||
|
public class AuthController {
|
||||||
|
|
||||||
|
private final String base_title = " | Bunker";
|
||||||
|
|
||||||
|
private final UserService userService;
|
||||||
|
private final InviteService inviteService;
|
||||||
|
|
||||||
|
public AuthController(UserService userService, InviteService inviteService) {
|
||||||
|
this.inviteService = inviteService;
|
||||||
|
this.userService = userService;
|
||||||
|
}
|
||||||
|
|
||||||
|
@GetMapping("/login")
|
||||||
|
public String loginPage(Model model) {
|
||||||
|
model.addAttribute("title", "Login" + base_title);
|
||||||
|
return "login";
|
||||||
|
}
|
||||||
|
|
||||||
|
@GetMapping("/access-denied")
|
||||||
|
public String accessDenied(Model model) {
|
||||||
|
model.addAttribute("title", "Access denied");
|
||||||
|
return "access-denied";
|
||||||
|
}
|
||||||
|
|
||||||
|
@GetMapping("/signup")
|
||||||
|
public String showRegistrationForm(Model model) {
|
||||||
|
UserDTO userDto = new UserDTO();
|
||||||
|
model.addAttribute("user", userDto);
|
||||||
|
return "signup";
|
||||||
|
}
|
||||||
|
|
||||||
|
@PostMapping("/signup")
|
||||||
|
public String registration(
|
||||||
|
@ModelAttribute("user") @Valid UserDTO userDto,
|
||||||
|
BindingResult result,
|
||||||
|
Model model) {
|
||||||
|
User existingUser = userService.findByUsername(userDto.getUsername());
|
||||||
|
Invite existingInvite = inviteService.findById(1);
|
||||||
|
|
||||||
|
if(existingUser != null && existingUser.getUsername() != null && !existingUser.getUsername().isEmpty() ){
|
||||||
|
result.rejectValue("username", null,
|
||||||
|
"There is already an account registered with the same username");
|
||||||
|
return "redirect:/signup?error=1";
|
||||||
|
}
|
||||||
|
|
||||||
|
if(!existingInvite.getInvite_code().equals(userDto.getInvite_code())) {
|
||||||
|
result.rejectValue("invite_code", null, "Incorrect invite code.");
|
||||||
|
return "redirect:/signup?error=1";
|
||||||
|
}
|
||||||
|
|
||||||
|
if(result.hasErrors()) {
|
||||||
|
model.addAttribute("user", new UserDTO());
|
||||||
|
return "redirect:/signup?error=1";
|
||||||
|
}
|
||||||
|
|
||||||
|
userService.saveUser(userDto);
|
||||||
|
return "redirect:/";
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,312 @@
|
|||||||
|
package com.alterdekim.javabot.controller;
|
||||||
|
|
||||||
|
import com.alterdekim.javabot.dto.SynergyResult;
|
||||||
|
import com.alterdekim.javabot.entities.*;
|
||||||
|
import com.alterdekim.javabot.service.*;
|
||||||
|
import com.alterdekim.javabot.util.HashUtils;
|
||||||
|
import com.fasterxml.jackson.core.JacksonException;
|
||||||
|
import com.fasterxml.jackson.databind.ObjectMapper;
|
||||||
|
import lombok.extern.slf4j.Slf4j;
|
||||||
|
import org.springframework.web.bind.annotation.PostMapping;
|
||||||
|
import org.springframework.web.bind.annotation.RequestParam;
|
||||||
|
import org.springframework.web.bind.annotation.RestController;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
|
@Slf4j
|
||||||
|
@RestController
|
||||||
|
public class DatabaseController {
|
||||||
|
private final BioService bioService;
|
||||||
|
private final HealthService healthService;
|
||||||
|
private final HobbyService hobbyService;
|
||||||
|
private final LuggageService luggageService;
|
||||||
|
private final WorkService workService;
|
||||||
|
private final TextDataValService textDataValService;
|
||||||
|
private final DisasterService disasterService;
|
||||||
|
private final SynergyService synergyService;
|
||||||
|
|
||||||
|
public DatabaseController(
|
||||||
|
BioService bioService,
|
||||||
|
HealthService healthService,
|
||||||
|
HobbyService hobbyService,
|
||||||
|
LuggageService luggageService,
|
||||||
|
WorkService workService,
|
||||||
|
TextDataValService textDataValService,
|
||||||
|
DisasterService disasterService,
|
||||||
|
SynergyService synergyService) {
|
||||||
|
this.bioService = bioService;
|
||||||
|
this.healthService = healthService;
|
||||||
|
this.hobbyService = hobbyService;
|
||||||
|
this.luggageService = luggageService;
|
||||||
|
this.workService = workService;
|
||||||
|
this.textDataValService = textDataValService;
|
||||||
|
this.disasterService = disasterService;
|
||||||
|
this.synergyService = synergyService;
|
||||||
|
}
|
||||||
|
|
||||||
|
private void saveGender(Map<String, String> params) {
|
||||||
|
Boolean canDie = Boolean.parseBoolean(params.get("canDie"));
|
||||||
|
Boolean ismale = Boolean.parseBoolean(params.get("ismale"));
|
||||||
|
Boolean isfemale = Boolean.parseBoolean(params.get("isfemale"));
|
||||||
|
String gender_text = new String(HashUtils.decodeHexString(params.get("gender_text")));
|
||||||
|
TextDataVal t = textDataValService.save(new TextDataVal(gender_text));
|
||||||
|
bioService.saveBio(new Bio(ismale, isfemale, canDie, t.getId()));
|
||||||
|
}
|
||||||
|
|
||||||
|
private void saveHobby(Map<String, String> params) {
|
||||||
|
Float powerRange = Float.parseFloat(params.get("powerRange"));
|
||||||
|
Float violenceRange = Float.parseFloat(params.get("violenceRange"));
|
||||||
|
Float healRange = Float.parseFloat(params.get("healRange"));
|
||||||
|
Float foodRange = Float.parseFloat(params.get("foodRange"));
|
||||||
|
String hobby_text = new String(HashUtils.decodeHexString(params.get("hobby_text")));
|
||||||
|
TextDataVal t = textDataValService.save(new TextDataVal(hobby_text));
|
||||||
|
hobbyService.saveHobby(new Hobby(foodRange, powerRange, violenceRange, healRange, t.getId()));
|
||||||
|
}
|
||||||
|
|
||||||
|
private void saveLuggage(Map<String, String> params) {
|
||||||
|
Float powerRange = Float.parseFloat(params.get("powerRange"));
|
||||||
|
Float violenceRange = Float.parseFloat(params.get("violenceRange"));
|
||||||
|
Float healRange = Float.parseFloat(params.get("healRange"));
|
||||||
|
Float foodRange = Float.parseFloat(params.get("foodRange"));
|
||||||
|
Boolean isGarbage = Boolean.parseBoolean(params.get("isgarbage"));
|
||||||
|
|
||||||
|
String name_text = new String(HashUtils.decodeHexString(params.get("luggage_name_text")));
|
||||||
|
TextDataVal t1 = textDataValService.save(new TextDataVal(name_text));
|
||||||
|
|
||||||
|
String desc_text = new String(HashUtils.decodeHexString(params.get("luggage_desc_text")));
|
||||||
|
TextDataVal t2 = textDataValService.save(new TextDataVal(desc_text));
|
||||||
|
|
||||||
|
luggageService.saveLuggage(new Luggage(violenceRange, powerRange, healRange, foodRange, isGarbage, t1.getId(), t2.getId()));
|
||||||
|
}
|
||||||
|
|
||||||
|
private void saveHealth(Map<String, String> params) {
|
||||||
|
Float health_index = Float.parseFloat(params.get("health_index"));
|
||||||
|
Boolean childFree = Boolean.parseBoolean(params.get("childFree"));
|
||||||
|
String name_text = new String(HashUtils.decodeHexString(params.get("heal_name_text")));
|
||||||
|
TextDataVal t1 = textDataValService.save(new TextDataVal(name_text));
|
||||||
|
|
||||||
|
String desc_text = new String(HashUtils.decodeHexString(params.get("heal_desc_text")));
|
||||||
|
TextDataVal t2 = textDataValService.save(new TextDataVal(desc_text));
|
||||||
|
|
||||||
|
healthService.saveHealth(new Health(health_index, t1.getId(), t2.getId(), childFree));
|
||||||
|
}
|
||||||
|
|
||||||
|
private void saveWork(Map<String, String> params) {
|
||||||
|
Float powerRange = Float.parseFloat(params.get("powerRange"));
|
||||||
|
Float violenceRange = Float.parseFloat(params.get("violenceRange"));
|
||||||
|
Float healRange = Float.parseFloat(params.get("healRange"));
|
||||||
|
Float foodRange = Float.parseFloat(params.get("foodRange"));
|
||||||
|
|
||||||
|
String name_text = new String(HashUtils.decodeHexString(params.get("work_name_text")));
|
||||||
|
TextDataVal t1 = textDataValService.save(new TextDataVal(name_text));
|
||||||
|
|
||||||
|
String desc_text = new String(HashUtils.decodeHexString(params.get("work_desc_text")));
|
||||||
|
TextDataVal t2 = textDataValService.save(new TextDataVal(desc_text));
|
||||||
|
|
||||||
|
workService.saveWork(new Work(healRange, powerRange, violenceRange, foodRange, t1.getId(), t2.getId()));
|
||||||
|
}
|
||||||
|
|
||||||
|
private void saveDiss(Map<String, String> params) {
|
||||||
|
String name_text = new String(HashUtils.decodeHexString(params.get("diss_name_text")));
|
||||||
|
TextDataVal t1 = textDataValService.save(new TextDataVal(name_text));
|
||||||
|
|
||||||
|
String desc_text = new String(HashUtils.decodeHexString(params.get("diss_desc_text")));
|
||||||
|
TextDataVal t2 = textDataValService.save(new TextDataVal(desc_text));
|
||||||
|
|
||||||
|
disasterService.saveDisaster(new Disaster(t1.getId(), t2.getId()));
|
||||||
|
}
|
||||||
|
|
||||||
|
@PostMapping("/api/remove_synergy")
|
||||||
|
public String remove_synergy(@RequestParam Map<String, String> params) {
|
||||||
|
Long id = Long.parseLong(params.get("synergy_id"));
|
||||||
|
synergyService.removeById(id);
|
||||||
|
return "ok";
|
||||||
|
}
|
||||||
|
|
||||||
|
@PostMapping("/api/add_synergy")
|
||||||
|
public String add_synergy(@RequestParam Map<String, String> params) {
|
||||||
|
Long feid = Long.parseLong(params.get("first_entity_id"));
|
||||||
|
ColumnType fetype = ColumnType.values()[Integer.parseInt(params.get("first_entity_type"))];
|
||||||
|
Long seid = Long.parseLong(params.get("second_entity_id"));
|
||||||
|
ColumnType setype = ColumnType.values()[Integer.parseInt(params.get("second_entity_type"))];
|
||||||
|
Float probability = Float.parseFloat(params.get("probability"));
|
||||||
|
|
||||||
|
synergyService.saveSynergy(new Synergy(feid, fetype, seid, setype, probability));
|
||||||
|
|
||||||
|
return "ok";
|
||||||
|
}
|
||||||
|
|
||||||
|
@PostMapping("/api/get_synergies")
|
||||||
|
public String get_synergies(@RequestParam Map<String, String> params) {
|
||||||
|
Long id = Long.parseLong(params.get("entity_id"));
|
||||||
|
String section = params.get("entity_type");
|
||||||
|
ObjectMapper mapper = new ObjectMapper();
|
||||||
|
try {
|
||||||
|
List<Synergy> synergyList = new ArrayList<>();
|
||||||
|
switch (section) {
|
||||||
|
case "agge":
|
||||||
|
synergyList = bioService.getSynergies(id);
|
||||||
|
break;
|
||||||
|
case "lugg":
|
||||||
|
synergyList = luggageService.getSynergies(id);
|
||||||
|
break;
|
||||||
|
case "prof":
|
||||||
|
synergyList = workService.getSynergies(id);
|
||||||
|
break;
|
||||||
|
case "heal":
|
||||||
|
synergyList = healthService.getSynergies(id);
|
||||||
|
break;
|
||||||
|
case "hobb":
|
||||||
|
synergyList = hobbyService.getSynergies(id);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
List<SynergyResult> results = new ArrayList<>();
|
||||||
|
for( Synergy s : synergyList ) {
|
||||||
|
String textFirst = getText(s.getFirstType(), s.getFirstEntityId());
|
||||||
|
String textSecond = getText(s.getSecondType(), s.getSecondEntityId());
|
||||||
|
results.add(new SynergyResult(s.getId(), textFirst, textSecond, s.getFirstType(), s.getSecondType(), s.getProbabilityValue()));
|
||||||
|
}
|
||||||
|
return mapper.writeValueAsString(results);
|
||||||
|
} catch (JacksonException e) {
|
||||||
|
log.error(e.getMessage());
|
||||||
|
}
|
||||||
|
return "ok";
|
||||||
|
}
|
||||||
|
|
||||||
|
private String getText(ColumnType type, Long feid) {
|
||||||
|
switch (type) {
|
||||||
|
case Bio:
|
||||||
|
return textDataValService.getTextDataValById(bioService.getBioById(feid).getGenderTextId()).getText();
|
||||||
|
case Health:
|
||||||
|
return textDataValService.getTextDataValById(healthService.getHealthById(feid).getTextNameId()).getText();
|
||||||
|
case Hobby:
|
||||||
|
return textDataValService.getTextDataValById(hobbyService.getHobbyById(feid).getTextDescId()).getText();
|
||||||
|
case Luggage:
|
||||||
|
return textDataValService.getTextDataValById(luggageService.getLuggageById(feid).getTextNameId()).getText();
|
||||||
|
case Work:
|
||||||
|
return textDataValService.getTextDataValById(workService.getWorkById(feid).getTextNameId()).getText();
|
||||||
|
}
|
||||||
|
return "-";
|
||||||
|
}
|
||||||
|
|
||||||
|
@PostMapping("/api/add_entry")
|
||||||
|
public String add_entry(@RequestParam Map<String, String> params) {
|
||||||
|
/* additional data, disasters */
|
||||||
|
String section = params.get("section");
|
||||||
|
switch (section) {
|
||||||
|
case "agge":
|
||||||
|
saveGender(params);
|
||||||
|
break;
|
||||||
|
case "lugg":
|
||||||
|
saveLuggage(params);
|
||||||
|
break;
|
||||||
|
case "prof":
|
||||||
|
saveWork(params);
|
||||||
|
break;
|
||||||
|
case "heal":
|
||||||
|
saveHealth(params);
|
||||||
|
break;
|
||||||
|
case "hobb":
|
||||||
|
saveHobby(params);
|
||||||
|
break;
|
||||||
|
case "diss":
|
||||||
|
saveDiss(params);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
saveDiss(params);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
return "ok";
|
||||||
|
}
|
||||||
|
|
||||||
|
@PostMapping("/api/remove_entry")
|
||||||
|
public String remove_entry(@RequestParam Map<String, String> params) {
|
||||||
|
String section = params.get("section");
|
||||||
|
long entry_id = Long.parseLong(params.get("entry_id"));
|
||||||
|
switch (section) {
|
||||||
|
case "agge":
|
||||||
|
bioService.removeById(entry_id);
|
||||||
|
break;
|
||||||
|
case "hobb":
|
||||||
|
hobbyService.removeById(entry_id);
|
||||||
|
break;
|
||||||
|
case "lugg":
|
||||||
|
luggageService.removeById(entry_id);
|
||||||
|
break;
|
||||||
|
case "heal":
|
||||||
|
healthService.removeById(entry_id);
|
||||||
|
break;
|
||||||
|
case "prof":
|
||||||
|
workService.removeById(entry_id);
|
||||||
|
break;
|
||||||
|
case "diss":
|
||||||
|
disasterService.removeById(entry_id);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
disasterService.removeById(entry_id);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
return "ok";
|
||||||
|
}
|
||||||
|
|
||||||
|
@PostMapping("/api/getTextById")
|
||||||
|
public String getText(@RequestParam Map<String, String> params) {
|
||||||
|
long l = Long.parseLong(params.get("entry_id"));
|
||||||
|
return textDataValService.getTextDataValById(l).getText();
|
||||||
|
}
|
||||||
|
|
||||||
|
@PostMapping("/api/get_entries")
|
||||||
|
public String getEntries(@RequestParam Map<String, String> params) {
|
||||||
|
ObjectMapper mapper = new ObjectMapper();
|
||||||
|
try {
|
||||||
|
switch (params.get("section")) {
|
||||||
|
case "agge":
|
||||||
|
return mapper.writeValueAsString(bioService.getAllBios());
|
||||||
|
case "hobb":
|
||||||
|
return mapper.writeValueAsString(hobbyService.getAllHobbies());
|
||||||
|
case "prof":
|
||||||
|
return mapper.writeValueAsString(workService.getAllWorks());
|
||||||
|
case "heal":
|
||||||
|
return mapper.writeValueAsString(healthService.getAllHealth());
|
||||||
|
case "lugg":
|
||||||
|
return mapper.writeValueAsString(luggageService.getAllLuggages());
|
||||||
|
case "diss":
|
||||||
|
return mapper.writeValueAsString(disasterService.getAllDisasters());
|
||||||
|
default:
|
||||||
|
return mapper.writeValueAsString(disasterService.getAllDisasters());
|
||||||
|
}
|
||||||
|
} catch (JacksonException e) {
|
||||||
|
log.error(e.getMessage());
|
||||||
|
}
|
||||||
|
return "error";
|
||||||
|
}
|
||||||
|
|
||||||
|
@PostMapping("/api/edit_entry")
|
||||||
|
public String edit_entry(@RequestParam Map<String, String> params) {
|
||||||
|
ObjectMapper mapper = new ObjectMapper();
|
||||||
|
long l = Long.parseLong(params.get("entry_id"));
|
||||||
|
try {
|
||||||
|
switch (params.get("section")) {
|
||||||
|
case "agge":
|
||||||
|
return mapper.writeValueAsString(bioService.getBioById(l));
|
||||||
|
case "hobb":
|
||||||
|
return mapper.writeValueAsString(hobbyService.getHobbyById(l));
|
||||||
|
case "prof":
|
||||||
|
return mapper.writeValueAsString(workService.getWorkById(l));
|
||||||
|
case "heal":
|
||||||
|
return mapper.writeValueAsString(healthService.getHealthById(l));
|
||||||
|
case "lugg":
|
||||||
|
return mapper.writeValueAsString(luggageService.getLuggageById(l));
|
||||||
|
case "diss":
|
||||||
|
return mapper.writeValueAsString(disasterService.getDisasterById(l));
|
||||||
|
default:
|
||||||
|
return mapper.writeValueAsString(disasterService.getDisasterById(l));
|
||||||
|
}
|
||||||
|
} catch (JacksonException e) {
|
||||||
|
log.error(e.getMessage());
|
||||||
|
}
|
||||||
|
return "error";
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,175 @@
|
|||||||
|
package com.alterdekim.javabot.controller;
|
||||||
|
|
||||||
|
import com.alterdekim.javabot.entities.*;
|
||||||
|
import com.alterdekim.javabot.service.*;
|
||||||
|
import com.alterdekim.javabot.util.UAgentInfo;
|
||||||
|
import lombok.Getter;
|
||||||
|
import lombok.NoArgsConstructor;
|
||||||
|
import lombok.Setter;
|
||||||
|
import lombok.extern.slf4j.Slf4j;
|
||||||
|
import org.springframework.stereotype.Controller;
|
||||||
|
import org.springframework.ui.Model;
|
||||||
|
import org.springframework.web.bind.annotation.GetMapping;
|
||||||
|
import org.springframework.web.bind.annotation.RequestHeader;
|
||||||
|
import org.springframework.web.bind.annotation.RequestParam;
|
||||||
|
|
||||||
|
import java.io.Serializable;
|
||||||
|
import java.util.*;
|
||||||
|
|
||||||
|
@Slf4j
|
||||||
|
@Controller
|
||||||
|
public class PanelController {
|
||||||
|
private final BioService bioService;
|
||||||
|
private final HealthService healthService;
|
||||||
|
private final HobbyService hobbyService;
|
||||||
|
private final LuggageService luggageService;
|
||||||
|
private final WorkService workService;
|
||||||
|
private final TextDataValService textDataValService;
|
||||||
|
private final DisasterService disasterService;
|
||||||
|
|
||||||
|
public PanelController(
|
||||||
|
BioService bioService,
|
||||||
|
HealthService healthService,
|
||||||
|
HobbyService hobbyService,
|
||||||
|
LuggageService luggageService,
|
||||||
|
WorkService workService,
|
||||||
|
TextDataValService textDataValService,
|
||||||
|
DisasterService disasterService) {
|
||||||
|
this.bioService = bioService;
|
||||||
|
this.healthService = healthService;
|
||||||
|
this.hobbyService = hobbyService;
|
||||||
|
this.luggageService = luggageService;
|
||||||
|
this.workService = workService;
|
||||||
|
this.textDataValService = textDataValService;
|
||||||
|
this.disasterService = disasterService;
|
||||||
|
}
|
||||||
|
|
||||||
|
private List<Card> dissToCards() {
|
||||||
|
List<Disaster> bios = disasterService.getAllDisasters();
|
||||||
|
List<Card> cards = new ArrayList<>();
|
||||||
|
for( Disaster b : bios ) {
|
||||||
|
Card card = new Card();
|
||||||
|
card.setId(b.getId());
|
||||||
|
card.setTitle(textDataValService.getTextDataValById(b.getNameTextId()).getText());
|
||||||
|
card.setBody(Collections.singletonList("Description: " + textDataValService.getTextDataValById(b.getDescTextId()).getText()));
|
||||||
|
cards.add(card);
|
||||||
|
}
|
||||||
|
cards.sort(Comparator.comparing(Card::getId));
|
||||||
|
Collections.reverse(cards);
|
||||||
|
return cards;
|
||||||
|
}
|
||||||
|
|
||||||
|
private List<Card> bioToCards() {
|
||||||
|
List<Bio> bios = bioService.getAllBios();
|
||||||
|
List<Card> cards = new ArrayList<>();
|
||||||
|
for( Bio b : bios ) {
|
||||||
|
Card card = new Card();
|
||||||
|
card.setId(b.getId());
|
||||||
|
card.setTitle(textDataValService.getTextDataValById(b.getGenderTextId()).getText());
|
||||||
|
card.setBody(Arrays.asList("canDie: " + b.getCanDie(), "isMale: " + b.getIsMale(), "isFemale: " + b.getIsFemale()));
|
||||||
|
cards.add(card);
|
||||||
|
}
|
||||||
|
cards.sort(Comparator.comparing(Card::getId));
|
||||||
|
Collections.reverse(cards);
|
||||||
|
return cards;
|
||||||
|
}
|
||||||
|
|
||||||
|
private List<Card> hobbyToCards() {
|
||||||
|
List<Hobby> bios = hobbyService.getAllHobbies();
|
||||||
|
List<Card> cards = new ArrayList<>();
|
||||||
|
for( Hobby b : bios ) {
|
||||||
|
Card card = new Card();
|
||||||
|
card.setId(b.getId());
|
||||||
|
card.setTitle(textDataValService.getTextDataValById(b.getTextDescId()).getText());
|
||||||
|
card.setBody(Arrays.asList("Foodstuffs: " + b.getFoodstuffs(), "Asocial: " + b.getAsocial(), "Power: " + b.getPower(), "Violence:" + b.getViolence()));
|
||||||
|
cards.add(card);
|
||||||
|
}
|
||||||
|
cards.sort(Comparator.comparing(Card::getId));
|
||||||
|
Collections.reverse(cards);
|
||||||
|
return cards;
|
||||||
|
}
|
||||||
|
|
||||||
|
private List<Card> workToCards() {
|
||||||
|
List<Work> bios = workService.getAllWorks();
|
||||||
|
List<Card> cards = new ArrayList<>();
|
||||||
|
for( Work b : bios ) {
|
||||||
|
Card card = new Card();
|
||||||
|
card.setId(b.getId());
|
||||||
|
card.setTitle(textDataValService.getTextDataValById(b.getTextNameId()).getText());
|
||||||
|
card.setBody(Arrays.asList("Foodstuffs: " + b.getFoodstuffs(), "Power: " + b.getPower(), "Violence: " + b.getViolence(), "Asocial: " + b.getAsocial(), "Description: " + textDataValService.getTextDataValById(b.getTextDescId()).getText()));
|
||||||
|
cards.add(card);
|
||||||
|
}
|
||||||
|
cards.sort(Comparator.comparing(Card::getId));
|
||||||
|
Collections.reverse(cards);
|
||||||
|
return cards;
|
||||||
|
}
|
||||||
|
|
||||||
|
private List<Card> healToCards() {
|
||||||
|
List<Health> bios = healthService.getAllHealth();
|
||||||
|
List<Card> cards = new ArrayList<>();
|
||||||
|
for( Health b : bios ) {
|
||||||
|
Card card = new Card();
|
||||||
|
card.setId(b.getId());
|
||||||
|
card.setTitle(textDataValService.getTextDataValById(b.getTextNameId()).getText());
|
||||||
|
card.setBody(Arrays.asList("Health index: " + b.getHealth_index(),"isChildfree: " + b.getIsChildfree(), "Description: " + textDataValService.getTextDataValById(b.getTextDescId()).getText()));
|
||||||
|
cards.add(card);
|
||||||
|
}
|
||||||
|
cards.sort(Comparator.comparing(Card::getId));
|
||||||
|
Collections.reverse(cards);
|
||||||
|
return cards;
|
||||||
|
}
|
||||||
|
|
||||||
|
private List<Card> luggageToCards() {
|
||||||
|
List<Luggage> bios = luggageService.getAllLuggages();
|
||||||
|
List<Card> cards = new ArrayList<>();
|
||||||
|
for( Luggage b : bios ) {
|
||||||
|
Card card = new Card();
|
||||||
|
card.setId(b.getId());
|
||||||
|
card.setTitle(textDataValService.getTextDataValById(b.getTextNameId()).getText());
|
||||||
|
card.setBody(Arrays.asList("Foodstuffs: " + b.getFoodstuffs(), "Power: " + b.getPower(), "Asocial: " + b.getAsocial(), "Violence: " + b.getViolence(), "Is garbage: " + b.getGarbage(), "Description: " + textDataValService.getTextDataValById(b.getTextDescId()).getText()));
|
||||||
|
cards.add(card);
|
||||||
|
}
|
||||||
|
cards.sort(Comparator.comparing(Card::getId));
|
||||||
|
Collections.reverse(cards);
|
||||||
|
return cards;
|
||||||
|
}
|
||||||
|
|
||||||
|
@GetMapping("/panel")
|
||||||
|
public String panelPage(Model model, @RequestHeader("User-Agent") String uagent, @RequestHeader("Accept") String accepth, @RequestParam(value = "section", defaultValue = "diss") String section) {
|
||||||
|
model.addAttribute("is_mobile", new UAgentInfo(uagent, accepth).detectSmartphone());
|
||||||
|
model.addAttribute("section", section);
|
||||||
|
switch (section) {
|
||||||
|
case "lugg":
|
||||||
|
model.addAttribute( "cards", luggageToCards() );
|
||||||
|
break;
|
||||||
|
case "heal":
|
||||||
|
model.addAttribute("cards", healToCards() );
|
||||||
|
break;
|
||||||
|
case "prof":
|
||||||
|
model.addAttribute("cards", workToCards() );
|
||||||
|
break;
|
||||||
|
case "hobb":
|
||||||
|
model.addAttribute("cards", hobbyToCards() );
|
||||||
|
break;
|
||||||
|
case "agge":
|
||||||
|
model.addAttribute("cards", bioToCards() );
|
||||||
|
break;
|
||||||
|
case "diss":
|
||||||
|
model.addAttribute("cards", dissToCards() );
|
||||||
|
break;
|
||||||
|
case "stats":
|
||||||
|
// !
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
return "panel";
|
||||||
|
}
|
||||||
|
|
||||||
|
@Getter
|
||||||
|
@Setter
|
||||||
|
@NoArgsConstructor
|
||||||
|
private static class Card implements Serializable {
|
||||||
|
private String title;
|
||||||
|
private List<String> body;
|
||||||
|
private Long id;
|
||||||
|
}
|
||||||
|
}
|
18
src/main/java/com/alterdekim/javabot/dto/SynergyResult.java
Normal file
18
src/main/java/com/alterdekim/javabot/dto/SynergyResult.java
Normal file
@ -0,0 +1,18 @@
|
|||||||
|
package com.alterdekim.javabot.dto;
|
||||||
|
|
||||||
|
import com.alterdekim.javabot.entities.ColumnType;
|
||||||
|
import lombok.AllArgsConstructor;
|
||||||
|
import lombok.Data;
|
||||||
|
import lombok.NoArgsConstructor;
|
||||||
|
|
||||||
|
@NoArgsConstructor
|
||||||
|
@AllArgsConstructor
|
||||||
|
@Data
|
||||||
|
public class SynergyResult {
|
||||||
|
private Long id;
|
||||||
|
private String firstEntityText;
|
||||||
|
private String secondEntityText;
|
||||||
|
private ColumnType firstType;
|
||||||
|
private ColumnType secondType;
|
||||||
|
private Float probabilityValue;
|
||||||
|
}
|
23
src/main/java/com/alterdekim/javabot/dto/UserDTO.java
Normal file
23
src/main/java/com/alterdekim/javabot/dto/UserDTO.java
Normal file
@ -0,0 +1,23 @@
|
|||||||
|
package com.alterdekim.javabot.dto;
|
||||||
|
|
||||||
|
import jakarta.validation.constraints.NotEmpty;
|
||||||
|
import lombok.AllArgsConstructor;
|
||||||
|
import lombok.Getter;
|
||||||
|
import lombok.NoArgsConstructor;
|
||||||
|
import lombok.Setter;
|
||||||
|
|
||||||
|
@Getter
|
||||||
|
@Setter
|
||||||
|
@NoArgsConstructor
|
||||||
|
@AllArgsConstructor
|
||||||
|
public class UserDTO {
|
||||||
|
private Long id;
|
||||||
|
@NotEmpty(message = "Username should not be empty")
|
||||||
|
private String username;
|
||||||
|
@NotEmpty(message = "Password should not be empty")
|
||||||
|
private String password;
|
||||||
|
@NotEmpty(message = "Invite code should not be empty")
|
||||||
|
private String invite_code;
|
||||||
|
|
||||||
|
private String lang;
|
||||||
|
}
|
@ -0,0 +1,37 @@
|
|||||||
|
package com.alterdekim.javabot.entities;
|
||||||
|
|
||||||
|
import jakarta.persistence.*;
|
||||||
|
import lombok.AllArgsConstructor;
|
||||||
|
import lombok.Getter;
|
||||||
|
import lombok.NoArgsConstructor;
|
||||||
|
import lombok.Setter;
|
||||||
|
|
||||||
|
@Getter
|
||||||
|
@Setter
|
||||||
|
@NoArgsConstructor
|
||||||
|
@AllArgsConstructor
|
||||||
|
@Entity
|
||||||
|
@Table(name = "addfacts")
|
||||||
|
public class AdditionalFacts {
|
||||||
|
@Id
|
||||||
|
@GeneratedValue(strategy = GenerationType.IDENTITY)
|
||||||
|
private Long id;
|
||||||
|
|
||||||
|
@Column(nullable=false)
|
||||||
|
private Float violence;
|
||||||
|
|
||||||
|
@Column(nullable=false)
|
||||||
|
private Float power;
|
||||||
|
|
||||||
|
@Column(nullable=false)
|
||||||
|
private Float food;
|
||||||
|
|
||||||
|
@Column(nullable=false)
|
||||||
|
private Float heal;
|
||||||
|
|
||||||
|
@Column(nullable = false)
|
||||||
|
private Float health_index;
|
||||||
|
|
||||||
|
@Column(nullable = false)
|
||||||
|
private Long textDescId;
|
||||||
|
}
|
42
src/main/java/com/alterdekim/javabot/entities/Bio.java
Normal file
42
src/main/java/com/alterdekim/javabot/entities/Bio.java
Normal file
@ -0,0 +1,42 @@
|
|||||||
|
package com.alterdekim.javabot.entities;
|
||||||
|
|
||||||
|
|
||||||
|
import jakarta.persistence.*;
|
||||||
|
import lombok.AllArgsConstructor;
|
||||||
|
import lombok.Getter;
|
||||||
|
import lombok.NoArgsConstructor;
|
||||||
|
import lombok.Setter;
|
||||||
|
import org.hibernate.annotations.JoinFormula;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
@Getter
|
||||||
|
@Setter
|
||||||
|
@NoArgsConstructor
|
||||||
|
@AllArgsConstructor
|
||||||
|
@Entity
|
||||||
|
@Table(name = "bio")
|
||||||
|
public class Bio {
|
||||||
|
@Id
|
||||||
|
@GeneratedValue(strategy = GenerationType.IDENTITY)
|
||||||
|
private Long id;
|
||||||
|
|
||||||
|
public Bio(Boolean isMale, Boolean isFemale, Boolean canDie, Long genderTextId) {
|
||||||
|
this.isMale = isMale;
|
||||||
|
this.isFemale = isFemale;
|
||||||
|
this.canDie = canDie;
|
||||||
|
this.genderTextId = genderTextId;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Column(nullable = false)
|
||||||
|
private Boolean isMale;
|
||||||
|
|
||||||
|
@Column(nullable = false)
|
||||||
|
private Boolean isFemale;
|
||||||
|
|
||||||
|
@Column(nullable = false)
|
||||||
|
private Boolean canDie;
|
||||||
|
|
||||||
|
@Column(nullable = false)
|
||||||
|
private Long genderTextId;
|
||||||
|
}
|
@ -0,0 +1,9 @@
|
|||||||
|
package com.alterdekim.javabot.entities;
|
||||||
|
|
||||||
|
public enum ColumnType {
|
||||||
|
Bio,
|
||||||
|
Health,
|
||||||
|
Hobby,
|
||||||
|
Luggage,
|
||||||
|
Work
|
||||||
|
}
|
31
src/main/java/com/alterdekim/javabot/entities/Disaster.java
Normal file
31
src/main/java/com/alterdekim/javabot/entities/Disaster.java
Normal file
@ -0,0 +1,31 @@
|
|||||||
|
package com.alterdekim.javabot.entities;
|
||||||
|
|
||||||
|
|
||||||
|
import jakarta.persistence.*;
|
||||||
|
import lombok.AllArgsConstructor;
|
||||||
|
import lombok.Getter;
|
||||||
|
import lombok.NoArgsConstructor;
|
||||||
|
import lombok.Setter;
|
||||||
|
|
||||||
|
@Getter
|
||||||
|
@Setter
|
||||||
|
@NoArgsConstructor
|
||||||
|
@AllArgsConstructor
|
||||||
|
@Entity
|
||||||
|
@Table(name = "disasters")
|
||||||
|
public class Disaster {
|
||||||
|
@Id
|
||||||
|
@GeneratedValue(strategy = GenerationType.IDENTITY)
|
||||||
|
private Long id;
|
||||||
|
|
||||||
|
@Column(nullable = false)
|
||||||
|
private Long nameTextId;
|
||||||
|
|
||||||
|
@Column(nullable = false)
|
||||||
|
private Long descTextId;
|
||||||
|
|
||||||
|
public Disaster(Long nameTextId, Long descTextId) {
|
||||||
|
this.nameTextId = nameTextId;
|
||||||
|
this.descTextId = descTextId;
|
||||||
|
}
|
||||||
|
}
|
38
src/main/java/com/alterdekim/javabot/entities/GameStats.java
Normal file
38
src/main/java/com/alterdekim/javabot/entities/GameStats.java
Normal file
@ -0,0 +1,38 @@
|
|||||||
|
package com.alterdekim.javabot.entities;
|
||||||
|
|
||||||
|
import jakarta.persistence.*;
|
||||||
|
import lombok.AllArgsConstructor;
|
||||||
|
import lombok.Getter;
|
||||||
|
import lombok.NoArgsConstructor;
|
||||||
|
import lombok.Setter;
|
||||||
|
|
||||||
|
@Getter
|
||||||
|
@Setter
|
||||||
|
@NoArgsConstructor
|
||||||
|
@AllArgsConstructor
|
||||||
|
@Entity
|
||||||
|
@Table(name = "game_stats")
|
||||||
|
public class GameStats {
|
||||||
|
@Id
|
||||||
|
@GeneratedValue(strategy = GenerationType.IDENTITY)
|
||||||
|
private Long id;
|
||||||
|
|
||||||
|
@Column(nullable = false)
|
||||||
|
private Long gameId;
|
||||||
|
|
||||||
|
@Column(nullable = false)
|
||||||
|
private Short turnNumber;
|
||||||
|
|
||||||
|
@Column(nullable = false)
|
||||||
|
private Double probability;
|
||||||
|
|
||||||
|
@Column(nullable = false)
|
||||||
|
private Integer playersCount;
|
||||||
|
|
||||||
|
public GameStats(Long gameId, Short turnNumber, Double probability, Integer playersCount) {
|
||||||
|
this.gameId = gameId;
|
||||||
|
this.turnNumber = turnNumber;
|
||||||
|
this.probability = probability;
|
||||||
|
this.playersCount = playersCount;
|
||||||
|
}
|
||||||
|
}
|
39
src/main/java/com/alterdekim/javabot/entities/Games.java
Normal file
39
src/main/java/com/alterdekim/javabot/entities/Games.java
Normal file
@ -0,0 +1,39 @@
|
|||||||
|
package com.alterdekim.javabot.entities;
|
||||||
|
|
||||||
|
import jakarta.persistence.*;
|
||||||
|
import lombok.AllArgsConstructor;
|
||||||
|
import lombok.Getter;
|
||||||
|
import lombok.NoArgsConstructor;
|
||||||
|
import lombok.Setter;
|
||||||
|
|
||||||
|
|
||||||
|
@Getter
|
||||||
|
@Setter
|
||||||
|
@NoArgsConstructor
|
||||||
|
@AllArgsConstructor
|
||||||
|
@Entity
|
||||||
|
@Table(name = "games_list")
|
||||||
|
public class Games {
|
||||||
|
@Id
|
||||||
|
@GeneratedValue(strategy = GenerationType.IDENTITY)
|
||||||
|
private Long id;
|
||||||
|
|
||||||
|
@Column(nullable = false)
|
||||||
|
private Boolean hasEnded;
|
||||||
|
|
||||||
|
@Column(nullable = false)
|
||||||
|
private Boolean hasStoppedManually;
|
||||||
|
|
||||||
|
@Column(nullable = false)
|
||||||
|
private Boolean isWon;
|
||||||
|
|
||||||
|
@Column(nullable = false)
|
||||||
|
private Long started;
|
||||||
|
|
||||||
|
public Games(Boolean hasEnded, Boolean hasStoppedManually, Boolean isWon, Long started) {
|
||||||
|
this.hasEnded = hasEnded;
|
||||||
|
this.hasStoppedManually = hasStoppedManually;
|
||||||
|
this.isWon = isWon;
|
||||||
|
this.started = started;
|
||||||
|
}
|
||||||
|
}
|
43
src/main/java/com/alterdekim/javabot/entities/Health.java
Normal file
43
src/main/java/com/alterdekim/javabot/entities/Health.java
Normal file
@ -0,0 +1,43 @@
|
|||||||
|
package com.alterdekim.javabot.entities;
|
||||||
|
|
||||||
|
import jakarta.persistence.*;
|
||||||
|
import lombok.AllArgsConstructor;
|
||||||
|
import lombok.Getter;
|
||||||
|
import lombok.NoArgsConstructor;
|
||||||
|
import lombok.Setter;
|
||||||
|
import org.hibernate.annotations.JoinFormula;
|
||||||
|
import org.springframework.data.jpa.repository.Query;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Set;
|
||||||
|
|
||||||
|
@Getter
|
||||||
|
@Setter
|
||||||
|
@NoArgsConstructor
|
||||||
|
@AllArgsConstructor
|
||||||
|
@Entity
|
||||||
|
@Table(name = "health")
|
||||||
|
public class Health {
|
||||||
|
@Id
|
||||||
|
@GeneratedValue(strategy = GenerationType.IDENTITY)
|
||||||
|
private Long id;
|
||||||
|
|
||||||
|
@Column(nullable = false)
|
||||||
|
private Float health_index;
|
||||||
|
|
||||||
|
@Column(nullable = false)
|
||||||
|
private Long textNameId;
|
||||||
|
|
||||||
|
@Column(nullable = false)
|
||||||
|
private Long textDescId;
|
||||||
|
|
||||||
|
@Column(nullable = false)
|
||||||
|
private Boolean isChildfree;
|
||||||
|
|
||||||
|
public Health(Float health_index, Long textNameId, Long textDescId, Boolean isChildfree) {
|
||||||
|
this.health_index = health_index;
|
||||||
|
this.textNameId = textNameId;
|
||||||
|
this.textDescId = textDescId;
|
||||||
|
this.isChildfree = isChildfree;
|
||||||
|
}
|
||||||
|
}
|
51
src/main/java/com/alterdekim/javabot/entities/Hobby.java
Normal file
51
src/main/java/com/alterdekim/javabot/entities/Hobby.java
Normal file
@ -0,0 +1,51 @@
|
|||||||
|
package com.alterdekim.javabot.entities;
|
||||||
|
|
||||||
|
import jakarta.persistence.*;
|
||||||
|
import lombok.AllArgsConstructor;
|
||||||
|
import lombok.Getter;
|
||||||
|
import lombok.NoArgsConstructor;
|
||||||
|
import lombok.Setter;
|
||||||
|
import org.hibernate.annotations.JoinFormula;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
@Getter
|
||||||
|
@Setter
|
||||||
|
@NoArgsConstructor
|
||||||
|
@AllArgsConstructor
|
||||||
|
@Entity
|
||||||
|
@Table(name = "hobby")
|
||||||
|
public class Hobby {
|
||||||
|
|
||||||
|
public Hobby(Float foodstuffs, Float power, Float violence, Float asocial, Long textDescId) {
|
||||||
|
this.foodstuffs = foodstuffs;
|
||||||
|
this.power = power;
|
||||||
|
this.violence = violence;
|
||||||
|
this.asocial = asocial;
|
||||||
|
this.textDescId = textDescId;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Id
|
||||||
|
@GeneratedValue(strategy = GenerationType.IDENTITY)
|
||||||
|
private Long id;
|
||||||
|
|
||||||
|
@Column(nullable = false)
|
||||||
|
private Float asocial;
|
||||||
|
|
||||||
|
@Column(nullable=false)
|
||||||
|
private Float power;
|
||||||
|
|
||||||
|
@Column(nullable=false)
|
||||||
|
private Float violence;
|
||||||
|
|
||||||
|
@Column(nullable=false)
|
||||||
|
private Float foodstuffs;
|
||||||
|
|
||||||
|
@Column(nullable = false)
|
||||||
|
private Long textDescId;
|
||||||
|
|
||||||
|
public Double getValue() {
|
||||||
|
return ((this.getFoodstuffs().doubleValue() +
|
||||||
|
this.getPower().doubleValue()) / 2.0d) - (((this.getViolence().doubleValue() + this.getAsocial().doubleValue()) / 2.0d));
|
||||||
|
}
|
||||||
|
}
|
22
src/main/java/com/alterdekim/javabot/entities/Invite.java
Normal file
22
src/main/java/com/alterdekim/javabot/entities/Invite.java
Normal file
@ -0,0 +1,22 @@
|
|||||||
|
package com.alterdekim.javabot.entities;
|
||||||
|
|
||||||
|
import jakarta.persistence.*;
|
||||||
|
import lombok.AllArgsConstructor;
|
||||||
|
import lombok.Getter;
|
||||||
|
import lombok.NoArgsConstructor;
|
||||||
|
import lombok.Setter;
|
||||||
|
|
||||||
|
@Getter
|
||||||
|
@Setter
|
||||||
|
@NoArgsConstructor
|
||||||
|
@AllArgsConstructor
|
||||||
|
@Entity
|
||||||
|
@Table(name = "invite_codes")
|
||||||
|
public class Invite {
|
||||||
|
@Id
|
||||||
|
@GeneratedValue(strategy = GenerationType.IDENTITY)
|
||||||
|
private Long id;
|
||||||
|
|
||||||
|
@Column(nullable=false)
|
||||||
|
private String invite_code;
|
||||||
|
}
|
61
src/main/java/com/alterdekim/javabot/entities/Luggage.java
Normal file
61
src/main/java/com/alterdekim/javabot/entities/Luggage.java
Normal file
@ -0,0 +1,61 @@
|
|||||||
|
package com.alterdekim.javabot.entities;
|
||||||
|
|
||||||
|
import jakarta.persistence.*;
|
||||||
|
import lombok.AllArgsConstructor;
|
||||||
|
import lombok.Getter;
|
||||||
|
import lombok.NoArgsConstructor;
|
||||||
|
import lombok.Setter;
|
||||||
|
import org.hibernate.annotations.JoinColumnOrFormula;
|
||||||
|
import org.hibernate.annotations.JoinColumnsOrFormulas;
|
||||||
|
import org.hibernate.annotations.JoinFormula;
|
||||||
|
import org.hibernate.annotations.WhereJoinTable;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
@Getter
|
||||||
|
@Setter
|
||||||
|
@NoArgsConstructor
|
||||||
|
@AllArgsConstructor
|
||||||
|
@Entity
|
||||||
|
@Table(name = "luggage")
|
||||||
|
public class Luggage {
|
||||||
|
@Id
|
||||||
|
@GeneratedValue(strategy = GenerationType.IDENTITY)
|
||||||
|
private Long id;
|
||||||
|
|
||||||
|
public Luggage(Float violence, Float power, Float asocial, Float foodstuffs, Boolean garbage, Long textNameId, Long textDescId) {
|
||||||
|
this.violence = violence;
|
||||||
|
this.power = power;
|
||||||
|
this.asocial = asocial;
|
||||||
|
this.foodstuffs = foodstuffs;
|
||||||
|
this.garbage = garbage;
|
||||||
|
this.textNameId = textNameId;
|
||||||
|
this.textDescId = textDescId;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Column(nullable=false)
|
||||||
|
private Float violence;
|
||||||
|
|
||||||
|
@Column(nullable=false)
|
||||||
|
private Float power;
|
||||||
|
|
||||||
|
@Column(nullable = false)
|
||||||
|
private Float asocial;
|
||||||
|
|
||||||
|
@Column(nullable=false)
|
||||||
|
private Float foodstuffs;
|
||||||
|
|
||||||
|
@Column(nullable=false)
|
||||||
|
private Boolean garbage;
|
||||||
|
|
||||||
|
@Column(nullable = false)
|
||||||
|
private Long textNameId;
|
||||||
|
|
||||||
|
@Column(nullable = false)
|
||||||
|
private Long textDescId;
|
||||||
|
|
||||||
|
public Double getValue() {
|
||||||
|
return ((this.getFoodstuffs().doubleValue() +
|
||||||
|
this.getPower().doubleValue()) * 0.5d) - (((this.getViolence().doubleValue() + this.getAsocial().doubleValue()) / 2.0d));
|
||||||
|
}
|
||||||
|
}
|
28
src/main/java/com/alterdekim/javabot/entities/Role.java
Normal file
28
src/main/java/com/alterdekim/javabot/entities/Role.java
Normal file
@ -0,0 +1,28 @@
|
|||||||
|
package com.alterdekim.javabot.entities;
|
||||||
|
|
||||||
|
import jakarta.persistence.*;
|
||||||
|
import lombok.AllArgsConstructor;
|
||||||
|
import lombok.Getter;
|
||||||
|
import lombok.NoArgsConstructor;
|
||||||
|
import lombok.Setter;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
@Setter
|
||||||
|
@Getter
|
||||||
|
@NoArgsConstructor
|
||||||
|
@AllArgsConstructor
|
||||||
|
@Entity
|
||||||
|
@Table(name="roles")
|
||||||
|
public class Role
|
||||||
|
{
|
||||||
|
@Id
|
||||||
|
@GeneratedValue(strategy = GenerationType.IDENTITY)
|
||||||
|
private Long id;
|
||||||
|
|
||||||
|
@Column(nullable=false, unique=true)
|
||||||
|
private String name;
|
||||||
|
|
||||||
|
@ManyToMany(mappedBy="roles")
|
||||||
|
private List<User> users;
|
||||||
|
}
|
42
src/main/java/com/alterdekim/javabot/entities/Synergy.java
Normal file
42
src/main/java/com/alterdekim/javabot/entities/Synergy.java
Normal file
@ -0,0 +1,42 @@
|
|||||||
|
package com.alterdekim.javabot.entities;
|
||||||
|
|
||||||
|
import jakarta.persistence.*;
|
||||||
|
import lombok.AllArgsConstructor;
|
||||||
|
import lombok.Getter;
|
||||||
|
import lombok.NoArgsConstructor;
|
||||||
|
import lombok.Setter;
|
||||||
|
|
||||||
|
@Getter
|
||||||
|
@Setter
|
||||||
|
@NoArgsConstructor
|
||||||
|
@AllArgsConstructor
|
||||||
|
@Entity
|
||||||
|
@Table(name = "synergy")
|
||||||
|
public class Synergy {
|
||||||
|
@Id
|
||||||
|
@GeneratedValue(strategy = GenerationType.IDENTITY)
|
||||||
|
private Long id;
|
||||||
|
|
||||||
|
@Column(nullable = false)
|
||||||
|
private Long firstEntityId;
|
||||||
|
|
||||||
|
@Enumerated(EnumType.ORDINAL)
|
||||||
|
private ColumnType firstType;
|
||||||
|
|
||||||
|
@Column(nullable = false)
|
||||||
|
private Long secondEntityId;
|
||||||
|
|
||||||
|
@Enumerated(EnumType.ORDINAL)
|
||||||
|
private ColumnType secondType;
|
||||||
|
|
||||||
|
@Column(nullable = false)
|
||||||
|
private Float probabilityValue;
|
||||||
|
|
||||||
|
public Synergy(Long firstEntityId, ColumnType firstType, Long secondEntityId, ColumnType secondType, Float probabilityValue) {
|
||||||
|
this.firstEntityId = firstEntityId;
|
||||||
|
this.firstType = firstType;
|
||||||
|
this.secondEntityId = secondEntityId;
|
||||||
|
this.secondType = secondType;
|
||||||
|
this.probabilityValue = probabilityValue;
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,28 @@
|
|||||||
|
package com.alterdekim.javabot.entities;
|
||||||
|
|
||||||
|
import jakarta.persistence.*;
|
||||||
|
import jakarta.validation.constraints.NotNull;
|
||||||
|
import lombok.AllArgsConstructor;
|
||||||
|
import lombok.Getter;
|
||||||
|
import lombok.NoArgsConstructor;
|
||||||
|
import lombok.Setter;
|
||||||
|
|
||||||
|
@Getter
|
||||||
|
@Setter
|
||||||
|
@NoArgsConstructor
|
||||||
|
@AllArgsConstructor
|
||||||
|
@Entity
|
||||||
|
@Table(name = "textdata_val")
|
||||||
|
public class TextDataVal {
|
||||||
|
@Id
|
||||||
|
@GeneratedValue(strategy = GenerationType.IDENTITY)
|
||||||
|
private Long id;
|
||||||
|
|
||||||
|
@Column(length = 65555)
|
||||||
|
@NotNull
|
||||||
|
private String text;
|
||||||
|
|
||||||
|
public TextDataVal(String text) {
|
||||||
|
this.text = text;
|
||||||
|
}
|
||||||
|
}
|
39
src/main/java/com/alterdekim/javabot/entities/User.java
Normal file
39
src/main/java/com/alterdekim/javabot/entities/User.java
Normal file
@ -0,0 +1,39 @@
|
|||||||
|
package com.alterdekim.javabot.entities;
|
||||||
|
|
||||||
|
import jakarta.persistence.*;
|
||||||
|
import lombok.AllArgsConstructor;
|
||||||
|
import lombok.Getter;
|
||||||
|
import lombok.NoArgsConstructor;
|
||||||
|
import lombok.Setter;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
|
||||||
|
@Getter
|
||||||
|
@Setter
|
||||||
|
@NoArgsConstructor
|
||||||
|
@AllArgsConstructor
|
||||||
|
@Entity
|
||||||
|
@Table(name="users")
|
||||||
|
public class User {
|
||||||
|
private static final long serialVersionUID = 1L;
|
||||||
|
|
||||||
|
@Id
|
||||||
|
@GeneratedValue(strategy = GenerationType.IDENTITY)
|
||||||
|
private Long id;
|
||||||
|
|
||||||
|
@Column(nullable=false, unique=true)
|
||||||
|
private String username;
|
||||||
|
|
||||||
|
@Column(nullable=false)
|
||||||
|
private String password;
|
||||||
|
|
||||||
|
@ManyToMany(fetch = FetchType.EAGER, cascade=CascadeType.ALL)
|
||||||
|
@JoinTable(
|
||||||
|
name="users_roles",
|
||||||
|
joinColumns={@JoinColumn(name="USER_ID", referencedColumnName="ID")},
|
||||||
|
inverseJoinColumns={@JoinColumn(name="ROLE_ID", referencedColumnName="ID")})
|
||||||
|
private List<Role> roles = new ArrayList<>();
|
||||||
|
|
||||||
|
}
|
55
src/main/java/com/alterdekim/javabot/entities/Work.java
Normal file
55
src/main/java/com/alterdekim/javabot/entities/Work.java
Normal file
@ -0,0 +1,55 @@
|
|||||||
|
package com.alterdekim.javabot.entities;
|
||||||
|
|
||||||
|
|
||||||
|
import jakarta.persistence.*;
|
||||||
|
import lombok.AllArgsConstructor;
|
||||||
|
import lombok.Getter;
|
||||||
|
import lombok.NoArgsConstructor;
|
||||||
|
import lombok.Setter;
|
||||||
|
import org.hibernate.annotations.JoinFormula;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
@Getter
|
||||||
|
@Setter
|
||||||
|
@NoArgsConstructor
|
||||||
|
@AllArgsConstructor
|
||||||
|
@Entity
|
||||||
|
@Table(name = "work")
|
||||||
|
public class Work {
|
||||||
|
@Id
|
||||||
|
@GeneratedValue(strategy = GenerationType.IDENTITY)
|
||||||
|
private Long id;
|
||||||
|
|
||||||
|
@Column(nullable=false)
|
||||||
|
private Float asocial;
|
||||||
|
|
||||||
|
@Column(nullable=false)
|
||||||
|
private Float power;
|
||||||
|
|
||||||
|
@Column(nullable=false)
|
||||||
|
private Float violence;
|
||||||
|
|
||||||
|
@Column(nullable=false)
|
||||||
|
private Float foodstuffs;
|
||||||
|
|
||||||
|
@Column(nullable = false)
|
||||||
|
private Long textNameId;
|
||||||
|
|
||||||
|
@Column(nullable = false)
|
||||||
|
private Long textDescId;
|
||||||
|
|
||||||
|
public Work(Float asocial, Float power, Float violence, Float foodstuffs, Long textNameId, Long textDescId) {
|
||||||
|
this.asocial = asocial;
|
||||||
|
this.power = power;
|
||||||
|
this.violence = violence;
|
||||||
|
this.foodstuffs = foodstuffs;
|
||||||
|
this.textNameId = textNameId;
|
||||||
|
this.textDescId = textDescId;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Double getValue() {
|
||||||
|
return ((this.getFoodstuffs().doubleValue() +
|
||||||
|
this.getPower().doubleValue()) * 0.5d) - (((this.getViolence().doubleValue() + this.getAsocial().doubleValue()) / 2.0d));
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,15 @@
|
|||||||
|
package com.alterdekim.javabot.handler;
|
||||||
|
|
||||||
|
import jakarta.servlet.http.HttpServletRequest;
|
||||||
|
import jakarta.servlet.http.HttpServletResponse;
|
||||||
|
import org.springframework.security.access.AccessDeniedException;
|
||||||
|
import org.springframework.security.web.access.AccessDeniedHandler;
|
||||||
|
|
||||||
|
import java.io.IOException;
|
||||||
|
|
||||||
|
public class CustomAccessDeniedHandler implements AccessDeniedHandler {
|
||||||
|
@Override
|
||||||
|
public void handle(HttpServletRequest request, HttpServletResponse response, AccessDeniedException accessDeniedException) throws IOException {
|
||||||
|
response.sendRedirect("/access-denied");
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,13 @@
|
|||||||
|
package com.alterdekim.javabot.repository;
|
||||||
|
|
||||||
|
import com.alterdekim.javabot.entities.AdditionalFacts;
|
||||||
|
import org.springframework.data.jpa.repository.JpaRepository;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Optional;
|
||||||
|
|
||||||
|
public interface AdditionalFactsRepository extends JpaRepository<AdditionalFacts, Long> {
|
||||||
|
Optional<AdditionalFacts> findById(Long id);
|
||||||
|
|
||||||
|
List<AdditionalFacts> findAll();
|
||||||
|
}
|
@ -0,0 +1,19 @@
|
|||||||
|
package com.alterdekim.javabot.repository;
|
||||||
|
|
||||||
|
import com.alterdekim.javabot.entities.Bio;
|
||||||
|
import com.alterdekim.javabot.entities.Synergy;
|
||||||
|
import org.springframework.data.jpa.repository.JpaRepository;
|
||||||
|
import org.springframework.data.jpa.repository.Query;
|
||||||
|
import org.springframework.data.repository.query.Param;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Optional;
|
||||||
|
|
||||||
|
public interface BioRepository extends JpaRepository<Bio, Long> {
|
||||||
|
Optional<Bio> findById(Long id);
|
||||||
|
|
||||||
|
List<Bio> findAll();
|
||||||
|
|
||||||
|
@Query(value = "SELECT new Synergy(s.id, s.firstEntityId, s.firstType, s.secondEntityId, s.secondType, s.probabilityValue) FROM Synergy s WHERE (s.firstType = 0 AND s.firstEntityId = :uuid) OR (s.secondType = 0 AND s.secondEntityId = :uuid)")
|
||||||
|
List<Synergy> getSynergies(@Param(value = "uuid") Long bioId);
|
||||||
|
}
|
@ -0,0 +1,13 @@
|
|||||||
|
package com.alterdekim.javabot.repository;
|
||||||
|
|
||||||
|
import com.alterdekim.javabot.entities.Disaster;
|
||||||
|
import org.springframework.data.jpa.repository.JpaRepository;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Optional;
|
||||||
|
|
||||||
|
public interface DisasterRepository extends JpaRepository<Disaster, Long> {
|
||||||
|
Optional<Disaster> findById(Long id);
|
||||||
|
|
||||||
|
List<Disaster> findAll();
|
||||||
|
}
|
@ -0,0 +1,19 @@
|
|||||||
|
package com.alterdekim.javabot.repository;
|
||||||
|
|
||||||
|
import com.alterdekim.javabot.entities.Health;
|
||||||
|
import com.alterdekim.javabot.entities.Synergy;
|
||||||
|
import org.springframework.data.jpa.repository.JpaRepository;
|
||||||
|
import org.springframework.data.jpa.repository.Query;
|
||||||
|
import org.springframework.data.repository.query.Param;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Optional;
|
||||||
|
|
||||||
|
public interface HealthRepository extends JpaRepository<Health, Long> {
|
||||||
|
Optional<Health> findById(Long id);
|
||||||
|
|
||||||
|
List<Health> findAll();
|
||||||
|
|
||||||
|
@Query(value = "SELECT new Synergy(s.id, s.firstEntityId, s.firstType, s.secondEntityId, s.secondType, s.probabilityValue) FROM Synergy s WHERE (s.firstType = 1 AND s.firstEntityId = :uuid) OR (s.secondType = 1 AND s.secondEntityId = :uuid)")
|
||||||
|
List<Synergy> getSynergies(@Param(value = "uuid") Long healthId);
|
||||||
|
}
|
@ -0,0 +1,19 @@
|
|||||||
|
package com.alterdekim.javabot.repository;
|
||||||
|
|
||||||
|
import com.alterdekim.javabot.entities.Hobby;
|
||||||
|
import com.alterdekim.javabot.entities.Synergy;
|
||||||
|
import org.springframework.data.jpa.repository.JpaRepository;
|
||||||
|
import org.springframework.data.jpa.repository.Query;
|
||||||
|
import org.springframework.data.repository.query.Param;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Optional;
|
||||||
|
|
||||||
|
public interface HobbyRepository extends JpaRepository<Hobby, Long> {
|
||||||
|
Optional<Hobby> findById(Long id);
|
||||||
|
|
||||||
|
List<Hobby> findAll();
|
||||||
|
|
||||||
|
@Query(value = "SELECT new Synergy(s.id, s.firstEntityId, s.firstType, s.secondEntityId, s.secondType, s.probabilityValue) FROM Synergy s WHERE (s.firstType = 2 AND s.firstEntityId = :uuid) OR (s.secondType = 2 AND s.secondEntityId = :uuid)")
|
||||||
|
List<Synergy> getSynergies(@Param(value = "uuid") Long hobbId);
|
||||||
|
}
|
@ -0,0 +1,10 @@
|
|||||||
|
package com.alterdekim.javabot.repository;
|
||||||
|
|
||||||
|
import com.alterdekim.javabot.entities.Invite;
|
||||||
|
import org.springframework.data.jpa.repository.JpaRepository;
|
||||||
|
|
||||||
|
import java.util.Optional;
|
||||||
|
|
||||||
|
public interface InviteRepository extends JpaRepository<Invite, Integer> {
|
||||||
|
Optional<Invite> findById(Integer id);
|
||||||
|
}
|
@ -0,0 +1,19 @@
|
|||||||
|
package com.alterdekim.javabot.repository;
|
||||||
|
|
||||||
|
import com.alterdekim.javabot.entities.Luggage;
|
||||||
|
import com.alterdekim.javabot.entities.Synergy;
|
||||||
|
import org.springframework.data.jpa.repository.JpaRepository;
|
||||||
|
import org.springframework.data.jpa.repository.Query;
|
||||||
|
import org.springframework.data.repository.query.Param;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Optional;
|
||||||
|
|
||||||
|
public interface LuggageRepository extends JpaRepository<Luggage, Long> {
|
||||||
|
Optional<Luggage> findById(Long id);
|
||||||
|
|
||||||
|
List<Luggage> findAll();
|
||||||
|
|
||||||
|
@Query(value = "SELECT new Synergy(s.id, s.firstEntityId, s.firstType, s.secondEntityId, s.secondType, s.probabilityValue) FROM Synergy s WHERE (s.firstType = 3 AND s.firstEntityId = :uuid) OR (s.secondType = 3 AND s.secondEntityId = :uuid)")
|
||||||
|
List<Synergy> getSynergies(@Param(value = "uuid") Long luggId);
|
||||||
|
}
|
@ -0,0 +1,12 @@
|
|||||||
|
package com.alterdekim.javabot.repository;
|
||||||
|
|
||||||
|
import com.alterdekim.javabot.entities.Role;
|
||||||
|
import org.springframework.data.jpa.repository.JpaRepository;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
public interface RoleRepository extends JpaRepository<Role, Long> {
|
||||||
|
Role findByName(String name);
|
||||||
|
|
||||||
|
List<Role> findAll();
|
||||||
|
}
|
@ -0,0 +1,13 @@
|
|||||||
|
package com.alterdekim.javabot.repository;
|
||||||
|
|
||||||
|
import com.alterdekim.javabot.entities.Synergy;
|
||||||
|
import org.springframework.data.jpa.repository.JpaRepository;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Optional;
|
||||||
|
|
||||||
|
public interface SynergyRepository extends JpaRepository<Synergy, Long> {
|
||||||
|
Optional<Synergy> findById(Long id);
|
||||||
|
|
||||||
|
List<Synergy> findAll();
|
||||||
|
}
|
@ -0,0 +1,10 @@
|
|||||||
|
package com.alterdekim.javabot.repository;
|
||||||
|
|
||||||
|
import com.alterdekim.javabot.entities.TextDataVal;
|
||||||
|
import org.springframework.data.jpa.repository.JpaRepository;
|
||||||
|
|
||||||
|
import java.util.Optional;
|
||||||
|
|
||||||
|
public interface TextDataValRepository extends JpaRepository<TextDataVal, Long> {
|
||||||
|
Optional<TextDataVal> findById(Long id);
|
||||||
|
}
|
@ -0,0 +1,11 @@
|
|||||||
|
package com.alterdekim.javabot.repository;
|
||||||
|
|
||||||
|
import com.alterdekim.javabot.entities.User;
|
||||||
|
import org.springframework.data.jpa.repository.JpaRepository;
|
||||||
|
import org.springframework.stereotype.Repository;
|
||||||
|
|
||||||
|
@Repository
|
||||||
|
public interface UserRepository extends JpaRepository<User, Integer> {
|
||||||
|
User findByUsername(String username);
|
||||||
|
|
||||||
|
}
|
@ -0,0 +1,19 @@
|
|||||||
|
package com.alterdekim.javabot.repository;
|
||||||
|
|
||||||
|
import com.alterdekim.javabot.entities.Synergy;
|
||||||
|
import com.alterdekim.javabot.entities.Work;
|
||||||
|
import org.springframework.data.jpa.repository.JpaRepository;
|
||||||
|
import org.springframework.data.jpa.repository.Query;
|
||||||
|
import org.springframework.data.repository.query.Param;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Optional;
|
||||||
|
|
||||||
|
public interface WorkRepository extends JpaRepository<Work, Long> {
|
||||||
|
Optional<Work> findById(Long id);
|
||||||
|
|
||||||
|
List<Work> findAll();
|
||||||
|
|
||||||
|
@Query(value = "SELECT new Synergy(s.id, s.firstEntityId, s.firstType, s.secondEntityId, s.secondType, s.probabilityValue) FROM Synergy s WHERE (s.firstType = 4 AND s.firstEntityId = :uuid) OR (s.secondType = 4 AND s.secondEntityId = :uuid)")
|
||||||
|
List<Synergy> getSynergies(@Param(value = "uuid") Long workId);
|
||||||
|
}
|
@ -0,0 +1,77 @@
|
|||||||
|
package com.alterdekim.javabot.security;
|
||||||
|
|
||||||
|
import com.alterdekim.javabot.handler.CustomAccessDeniedHandler;
|
||||||
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
|
import org.springframework.context.annotation.Bean;
|
||||||
|
import org.springframework.context.annotation.Configuration;
|
||||||
|
import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder;
|
||||||
|
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
|
||||||
|
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
|
||||||
|
import org.springframework.security.core.userdetails.UserDetailsService;
|
||||||
|
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
|
||||||
|
import org.springframework.security.crypto.password.PasswordEncoder;
|
||||||
|
import org.springframework.security.web.SecurityFilterChain;
|
||||||
|
import org.springframework.security.web.access.AccessDeniedHandler;
|
||||||
|
import org.springframework.security.web.savedrequest.HttpSessionRequestCache;
|
||||||
|
import org.springframework.security.web.util.matcher.AntPathRequestMatcher;
|
||||||
|
|
||||||
|
@Configuration
|
||||||
|
@EnableWebSecurity
|
||||||
|
public class SpringSecurity {
|
||||||
|
|
||||||
|
@Autowired
|
||||||
|
private UserDetailsService userDetailsService;
|
||||||
|
|
||||||
|
@Bean
|
||||||
|
public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
|
||||||
|
HttpSessionRequestCache requestCache = new HttpSessionRequestCache();
|
||||||
|
requestCache.setMatchingRequestParameterName(null);
|
||||||
|
http.csrf().disable()
|
||||||
|
.authorizeHttpRequests((authorize) ->
|
||||||
|
authorize
|
||||||
|
.requestMatchers("/panel").hasAnyAuthority("ROLE_ADMIN")
|
||||||
|
.requestMatchers("/api/**").hasAnyAuthority("ROLE_ADMIN")
|
||||||
|
.requestMatchers("/static/**").permitAll()
|
||||||
|
.requestMatchers("/access-denied").permitAll()
|
||||||
|
.requestMatchers("/signup").permitAll()
|
||||||
|
.requestMatchers("/favicon.ico").permitAll()
|
||||||
|
.requestMatchers("/signup/**").permitAll()
|
||||||
|
.requestMatchers("/").permitAll()
|
||||||
|
).formLogin(
|
||||||
|
form -> form
|
||||||
|
.loginPage("/login")
|
||||||
|
.loginProcessingUrl("/login")
|
||||||
|
.failureForwardUrl("/")
|
||||||
|
.defaultSuccessUrl("/panel")
|
||||||
|
.permitAll()
|
||||||
|
)
|
||||||
|
.logout(
|
||||||
|
logout -> logout
|
||||||
|
.logoutUrl("/logout")
|
||||||
|
.logoutRequestMatcher(new AntPathRequestMatcher("/logout"))
|
||||||
|
.permitAll()
|
||||||
|
)
|
||||||
|
.requestCache((cache) -> cache
|
||||||
|
.requestCache(requestCache)
|
||||||
|
)
|
||||||
|
.exceptionHandling((exc) -> exc
|
||||||
|
.accessDeniedHandler(accessDeniedHandler())
|
||||||
|
.accessDeniedPage("/access-denied"));
|
||||||
|
return http.build();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Bean
|
||||||
|
public AccessDeniedHandler accessDeniedHandler() {
|
||||||
|
return new CustomAccessDeniedHandler();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Autowired
|
||||||
|
public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception {
|
||||||
|
auth.userDetailsService(userDetailsService).passwordEncoder(passwordEncoder());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Bean
|
||||||
|
public static PasswordEncoder passwordEncoder(){
|
||||||
|
return new BCryptPasswordEncoder();
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,10 @@
|
|||||||
|
package com.alterdekim.javabot.service;
|
||||||
|
|
||||||
|
import com.alterdekim.javabot.entities.AdditionalFacts;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
public interface AdditionalFactsService {
|
||||||
|
List<AdditionalFacts> getAllFacts();
|
||||||
|
AdditionalFacts getAdditionalFactById(long addFactId);
|
||||||
|
}
|
@ -0,0 +1,27 @@
|
|||||||
|
package com.alterdekim.javabot.service;
|
||||||
|
|
||||||
|
import com.alterdekim.javabot.entities.AdditionalFacts;
|
||||||
|
import com.alterdekim.javabot.repository.AdditionalFactsRepository;
|
||||||
|
import org.springframework.stereotype.Service;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
@Service
|
||||||
|
public class AdditionalFactsServiceImpl implements AdditionalFactsService {
|
||||||
|
|
||||||
|
private AdditionalFactsRepository repository;
|
||||||
|
|
||||||
|
public AdditionalFactsServiceImpl(AdditionalFactsRepository repository) {
|
||||||
|
this.repository = repository;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public List<AdditionalFacts> getAllFacts() {
|
||||||
|
return repository.findAll();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public AdditionalFacts getAdditionalFactById(long addFactId) {
|
||||||
|
return repository.findById(addFactId).orElse(null);
|
||||||
|
}
|
||||||
|
}
|
17
src/main/java/com/alterdekim/javabot/service/BioService.java
Normal file
17
src/main/java/com/alterdekim/javabot/service/BioService.java
Normal file
@ -0,0 +1,17 @@
|
|||||||
|
package com.alterdekim.javabot.service;
|
||||||
|
|
||||||
|
import com.alterdekim.javabot.entities.Bio;
|
||||||
|
import com.alterdekim.javabot.entities.Synergy;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
public interface BioService {
|
||||||
|
List<Bio> getAllBios();
|
||||||
|
Bio getBioById(long bioId);
|
||||||
|
|
||||||
|
void saveBio(Bio bio);
|
||||||
|
|
||||||
|
void removeById(Long id);
|
||||||
|
|
||||||
|
List<Synergy> getSynergies(Long id);
|
||||||
|
}
|
@ -0,0 +1,43 @@
|
|||||||
|
package com.alterdekim.javabot.service;
|
||||||
|
|
||||||
|
import com.alterdekim.javabot.entities.Bio;
|
||||||
|
import com.alterdekim.javabot.entities.Synergy;
|
||||||
|
import com.alterdekim.javabot.repository.BioRepository;
|
||||||
|
import org.springframework.stereotype.Service;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
@Service
|
||||||
|
public class BioServiceImpl implements BioService {
|
||||||
|
|
||||||
|
private BioRepository repository;
|
||||||
|
|
||||||
|
public BioServiceImpl(BioRepository repository) {
|
||||||
|
this.repository = repository;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public List<Bio> getAllBios() {
|
||||||
|
return repository.findAll();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Bio getBioById(long bioId) {
|
||||||
|
return repository.findById(bioId).orElse(null);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void saveBio(Bio bio) {
|
||||||
|
repository.save(bio);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void removeById(Long id) {
|
||||||
|
repository.deleteById(id);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public List<Synergy> getSynergies(Long id) {
|
||||||
|
return repository.getSynergies(id);
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,43 @@
|
|||||||
|
package com.alterdekim.javabot.service;
|
||||||
|
|
||||||
|
import com.alterdekim.javabot.entities.Role;
|
||||||
|
import com.alterdekim.javabot.entities.User;
|
||||||
|
import com.alterdekim.javabot.repository.UserRepository;
|
||||||
|
import org.springframework.security.core.GrantedAuthority;
|
||||||
|
import org.springframework.security.core.authority.SimpleGrantedAuthority;
|
||||||
|
import org.springframework.security.core.userdetails.UserDetails;
|
||||||
|
import org.springframework.security.core.userdetails.UserDetailsService;
|
||||||
|
import org.springframework.security.core.userdetails.UsernameNotFoundException;
|
||||||
|
import org.springframework.stereotype.Service;
|
||||||
|
|
||||||
|
import java.util.Collection;
|
||||||
|
import java.util.stream.Collectors;
|
||||||
|
|
||||||
|
@Service
|
||||||
|
public class CustomUserDetailsService implements UserDetailsService {
|
||||||
|
|
||||||
|
private final UserRepository userRepository;
|
||||||
|
|
||||||
|
public CustomUserDetailsService(UserRepository userRepository) {
|
||||||
|
this.userRepository = userRepository;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public UserDetails loadUserByUsername(String email) throws UsernameNotFoundException {
|
||||||
|
User user = userRepository.findByUsername(email);
|
||||||
|
|
||||||
|
if (user != null) {
|
||||||
|
return new org.springframework.security.core.userdetails.User(user.getUsername(),
|
||||||
|
user.getPassword(),
|
||||||
|
mapRolesToAuthorities(user.getRoles()));
|
||||||
|
}else{
|
||||||
|
throw new UsernameNotFoundException("Invalid username or password.");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private Collection < ? extends GrantedAuthority> mapRolesToAuthorities(Collection <Role> roles) {
|
||||||
|
return roles.stream()
|
||||||
|
.map(role -> new SimpleGrantedAuthority(role.getName()))
|
||||||
|
.collect(Collectors.toList());
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,14 @@
|
|||||||
|
package com.alterdekim.javabot.service;
|
||||||
|
|
||||||
|
import com.alterdekim.javabot.entities.Disaster;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
public interface DisasterService {
|
||||||
|
List<Disaster> getAllDisasters();
|
||||||
|
Disaster getDisasterById(long dId);
|
||||||
|
|
||||||
|
void removeById(long dId);
|
||||||
|
|
||||||
|
void saveDisaster(Disaster disaster);
|
||||||
|
}
|
@ -0,0 +1,37 @@
|
|||||||
|
package com.alterdekim.javabot.service;
|
||||||
|
|
||||||
|
import com.alterdekim.javabot.entities.Disaster;
|
||||||
|
import com.alterdekim.javabot.repository.DisasterRepository;
|
||||||
|
import org.springframework.stereotype.Service;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
@Service
|
||||||
|
public class DisasterServiceImpl implements DisasterService {
|
||||||
|
|
||||||
|
private final DisasterRepository repository;
|
||||||
|
|
||||||
|
public DisasterServiceImpl(DisasterRepository repository) {
|
||||||
|
this.repository = repository;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public List<Disaster> getAllDisasters() {
|
||||||
|
return repository.findAll();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Disaster getDisasterById(long dId) {
|
||||||
|
return repository.findById(dId).orElse(null);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void removeById(long dId) {
|
||||||
|
repository.deleteById(dId);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void saveDisaster(Disaster disaster) {
|
||||||
|
repository.save(disaster);
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,17 @@
|
|||||||
|
package com.alterdekim.javabot.service;
|
||||||
|
|
||||||
|
import com.alterdekim.javabot.entities.Health;
|
||||||
|
import com.alterdekim.javabot.entities.Synergy;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
public interface HealthService {
|
||||||
|
List<Health> getAllHealth();
|
||||||
|
Health getHealthById(long healthId);
|
||||||
|
|
||||||
|
void removeById(long healthId);
|
||||||
|
|
||||||
|
void saveHealth(Health health);
|
||||||
|
|
||||||
|
List<Synergy> getSynergies(Long id);
|
||||||
|
}
|
@ -0,0 +1,43 @@
|
|||||||
|
package com.alterdekim.javabot.service;
|
||||||
|
|
||||||
|
import com.alterdekim.javabot.entities.Health;
|
||||||
|
import com.alterdekim.javabot.entities.Synergy;
|
||||||
|
import com.alterdekim.javabot.repository.HealthRepository;
|
||||||
|
import org.springframework.stereotype.Service;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
@Service
|
||||||
|
public class HealthServiceImpl implements HealthService {
|
||||||
|
|
||||||
|
private final HealthRepository repository;
|
||||||
|
|
||||||
|
public HealthServiceImpl(HealthRepository repository) {
|
||||||
|
this.repository = repository;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public List<Health> getAllHealth() {
|
||||||
|
return repository.findAll();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Health getHealthById(long healthId) {
|
||||||
|
return repository.findById(healthId).orElse(null);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void removeById(long healthId) {
|
||||||
|
repository.deleteById(healthId);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void saveHealth(Health health) {
|
||||||
|
repository.save(health);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public List<Synergy> getSynergies(Long id) {
|
||||||
|
return repository.getSynergies(id);
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,17 @@
|
|||||||
|
package com.alterdekim.javabot.service;
|
||||||
|
|
||||||
|
import com.alterdekim.javabot.entities.Hobby;
|
||||||
|
import com.alterdekim.javabot.entities.Synergy;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
public interface HobbyService {
|
||||||
|
List<Hobby> getAllHobbies();
|
||||||
|
Hobby getHobbyById(long hobbyId);
|
||||||
|
|
||||||
|
void saveHobby(Hobby hobby);
|
||||||
|
|
||||||
|
void removeById(Long id);
|
||||||
|
|
||||||
|
List<Synergy> getSynergies(Long id);
|
||||||
|
}
|
@ -0,0 +1,43 @@
|
|||||||
|
package com.alterdekim.javabot.service;
|
||||||
|
|
||||||
|
import com.alterdekim.javabot.entities.Hobby;
|
||||||
|
import com.alterdekim.javabot.entities.Synergy;
|
||||||
|
import com.alterdekim.javabot.repository.HobbyRepository;
|
||||||
|
import org.springframework.stereotype.Service;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
@Service
|
||||||
|
public class HobbyServiceImpl implements HobbyService {
|
||||||
|
|
||||||
|
private final HobbyRepository repository;
|
||||||
|
|
||||||
|
public HobbyServiceImpl(HobbyRepository repository) {
|
||||||
|
this.repository = repository;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public List<Hobby> getAllHobbies() {
|
||||||
|
return repository.findAll();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Hobby getHobbyById(long hobbyId) {
|
||||||
|
return repository.findById(hobbyId).orElse(null);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void saveHobby(Hobby hobby) {
|
||||||
|
repository.save(hobby);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void removeById(Long id) {
|
||||||
|
repository.deleteById(id);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public List<Synergy> getSynergies(Long id) {
|
||||||
|
return repository.getSynergies(id);
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,7 @@
|
|||||||
|
package com.alterdekim.javabot.service;
|
||||||
|
|
||||||
|
import com.alterdekim.javabot.entities.Invite;
|
||||||
|
|
||||||
|
public interface InviteService {
|
||||||
|
Invite findById(Integer id);
|
||||||
|
}
|
@ -0,0 +1,20 @@
|
|||||||
|
package com.alterdekim.javabot.service;
|
||||||
|
|
||||||
|
import com.alterdekim.javabot.entities.Invite;
|
||||||
|
import com.alterdekim.javabot.repository.InviteRepository;
|
||||||
|
import org.springframework.stereotype.Service;
|
||||||
|
|
||||||
|
@Service
|
||||||
|
public class InviteServiceImpl implements InviteService {
|
||||||
|
|
||||||
|
private final InviteRepository repository;
|
||||||
|
|
||||||
|
public InviteServiceImpl(InviteRepository repository) {
|
||||||
|
this.repository = repository;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Invite findById(Integer id) {
|
||||||
|
return repository.findById(id).orElse(null);
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,17 @@
|
|||||||
|
package com.alterdekim.javabot.service;
|
||||||
|
|
||||||
|
import com.alterdekim.javabot.entities.Luggage;
|
||||||
|
import com.alterdekim.javabot.entities.Synergy;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
public interface LuggageService {
|
||||||
|
List<Luggage> getAllLuggages();
|
||||||
|
Luggage getLuggageById(long luggageId);
|
||||||
|
|
||||||
|
void removeById(long luggageId);
|
||||||
|
|
||||||
|
void saveLuggage(Luggage luggage);
|
||||||
|
|
||||||
|
List<Synergy> getSynergies(Long id);
|
||||||
|
}
|
@ -0,0 +1,43 @@
|
|||||||
|
package com.alterdekim.javabot.service;
|
||||||
|
|
||||||
|
import com.alterdekim.javabot.entities.Luggage;
|
||||||
|
import com.alterdekim.javabot.entities.Synergy;
|
||||||
|
import com.alterdekim.javabot.repository.LuggageRepository;
|
||||||
|
import org.springframework.stereotype.Service;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
@Service
|
||||||
|
public class LuggageServiceImpl implements LuggageService {
|
||||||
|
|
||||||
|
private final LuggageRepository repository;
|
||||||
|
|
||||||
|
public LuggageServiceImpl(LuggageRepository repository) {
|
||||||
|
this.repository = repository;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public List<Luggage> getAllLuggages() {
|
||||||
|
return repository.findAll();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Luggage getLuggageById(long luggageId) {
|
||||||
|
return repository.findById(luggageId).orElse(null);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void removeById(long luggageId) {
|
||||||
|
repository.deleteById(luggageId);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void saveLuggage(Luggage luggage) {
|
||||||
|
repository.save(luggage);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public List<Synergy> getSynergies(Long id) {
|
||||||
|
return repository.getSynergies(id);
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,14 @@
|
|||||||
|
package com.alterdekim.javabot.service;
|
||||||
|
|
||||||
|
import com.alterdekim.javabot.entities.Luggage;
|
||||||
|
import com.alterdekim.javabot.entities.Synergy;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
public interface SynergyService {
|
||||||
|
void removeById(long synergyId);
|
||||||
|
|
||||||
|
void saveSynergy(Synergy synergy);
|
||||||
|
|
||||||
|
List<Synergy> getAllSynergies();
|
||||||
|
}
|
@ -0,0 +1,32 @@
|
|||||||
|
package com.alterdekim.javabot.service;
|
||||||
|
|
||||||
|
import com.alterdekim.javabot.entities.Synergy;
|
||||||
|
import com.alterdekim.javabot.repository.SynergyRepository;
|
||||||
|
import org.springframework.stereotype.Service;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
@Service
|
||||||
|
public class SynergyServiceImpl implements SynergyService {
|
||||||
|
|
||||||
|
private final SynergyRepository repository;
|
||||||
|
|
||||||
|
public SynergyServiceImpl(SynergyRepository repository) {
|
||||||
|
this.repository = repository;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void removeById(long synergyId) {
|
||||||
|
repository.deleteById(synergyId);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void saveSynergy(Synergy synergy) {
|
||||||
|
repository.save(synergy);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public List<Synergy> getAllSynergies() {
|
||||||
|
return repository.findAll();
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,12 @@
|
|||||||
|
package com.alterdekim.javabot.service;
|
||||||
|
|
||||||
|
import com.alterdekim.javabot.entities.TextDataVal;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
public interface TextDataValService {
|
||||||
|
List<TextDataVal> getAllTexts();
|
||||||
|
TextDataVal getTextDataValById(long textId);
|
||||||
|
|
||||||
|
TextDataVal save(TextDataVal val);
|
||||||
|
}
|
@ -0,0 +1,32 @@
|
|||||||
|
package com.alterdekim.javabot.service;
|
||||||
|
|
||||||
|
import com.alterdekim.javabot.entities.TextDataVal;
|
||||||
|
import com.alterdekim.javabot.repository.TextDataValRepository;
|
||||||
|
import org.springframework.stereotype.Service;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
@Service
|
||||||
|
public class TextDataValServiceImpl implements TextDataValService {
|
||||||
|
|
||||||
|
private final TextDataValRepository repository;
|
||||||
|
|
||||||
|
public TextDataValServiceImpl(TextDataValRepository repository) {
|
||||||
|
this.repository = repository;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public List<TextDataVal> getAllTexts() {
|
||||||
|
return repository.findAll();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public TextDataVal getTextDataValById(long textId) {
|
||||||
|
return repository.findById(textId).orElse(null);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public TextDataVal save(TextDataVal val) {
|
||||||
|
return repository.save(val);
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,14 @@
|
|||||||
|
package com.alterdekim.javabot.service;
|
||||||
|
|
||||||
|
import com.alterdekim.javabot.dto.UserDTO;
|
||||||
|
import com.alterdekim.javabot.entities.User;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
public interface UserService {
|
||||||
|
void saveUser(UserDTO userDto);
|
||||||
|
|
||||||
|
User findByUsername(String usernane);
|
||||||
|
|
||||||
|
List<UserDTO> findAllUsers();
|
||||||
|
}
|
@ -0,0 +1,67 @@
|
|||||||
|
package com.alterdekim.javabot.service;
|
||||||
|
|
||||||
|
import com.alterdekim.javabot.dto.UserDTO;
|
||||||
|
import com.alterdekim.javabot.entities.Role;
|
||||||
|
import com.alterdekim.javabot.entities.User;
|
||||||
|
import com.alterdekim.javabot.repository.RoleRepository;
|
||||||
|
import com.alterdekim.javabot.repository.UserRepository;
|
||||||
|
import org.springframework.security.crypto.password.PasswordEncoder;
|
||||||
|
import org.springframework.stereotype.Service;
|
||||||
|
|
||||||
|
import java.util.Collections;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.stream.Collectors;
|
||||||
|
|
||||||
|
@Service
|
||||||
|
public class UserServiceImpl implements UserService {
|
||||||
|
|
||||||
|
private final UserRepository userRepository;
|
||||||
|
private final RoleRepository roleRepository;
|
||||||
|
private final PasswordEncoder passwordEncoder;
|
||||||
|
|
||||||
|
public UserServiceImpl(UserRepository userRepository,
|
||||||
|
RoleRepository roleRepository,
|
||||||
|
PasswordEncoder passwordEncoder) {
|
||||||
|
this.userRepository = userRepository;
|
||||||
|
this.roleRepository = roleRepository;
|
||||||
|
this.passwordEncoder = passwordEncoder;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void saveUser(UserDTO userDto) {
|
||||||
|
User user = new User();
|
||||||
|
user.setUsername(userDto.getUsername());
|
||||||
|
|
||||||
|
user.setPassword(passwordEncoder.encode(userDto.getPassword()));
|
||||||
|
Role role = roleRepository.findByName("ROLE_ADMIN");
|
||||||
|
if(role == null){
|
||||||
|
role = checkRoleExist();
|
||||||
|
}
|
||||||
|
user.setRoles(Collections.singletonList(role));
|
||||||
|
userRepository.save(user);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public User findByUsername(String username) {
|
||||||
|
return userRepository.findByUsername(username);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public List<UserDTO> findAllUsers() {
|
||||||
|
List<User> users = userRepository.findAll();
|
||||||
|
return users.stream().map(this::convertEntityToDto)
|
||||||
|
.collect(Collectors.toList());
|
||||||
|
}
|
||||||
|
|
||||||
|
private UserDTO convertEntityToDto(User user){
|
||||||
|
UserDTO userDto = new UserDTO();
|
||||||
|
userDto.setUsername(user.getUsername());
|
||||||
|
return userDto;
|
||||||
|
}
|
||||||
|
|
||||||
|
private Role checkRoleExist() {
|
||||||
|
Role role = new Role();
|
||||||
|
role.setName("ROLE_ADMIN");
|
||||||
|
return roleRepository.save(role);
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,17 @@
|
|||||||
|
package com.alterdekim.javabot.service;
|
||||||
|
|
||||||
|
import com.alterdekim.javabot.entities.Synergy;
|
||||||
|
import com.alterdekim.javabot.entities.Work;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
public interface WorkService {
|
||||||
|
List<Work> getAllWorks();
|
||||||
|
Work getWorkById(long workId);
|
||||||
|
|
||||||
|
void removeById(long workId);
|
||||||
|
|
||||||
|
void saveWork(Work work);
|
||||||
|
|
||||||
|
List<Synergy> getSynergies(Long id);
|
||||||
|
}
|
@ -0,0 +1,43 @@
|
|||||||
|
package com.alterdekim.javabot.service;
|
||||||
|
|
||||||
|
import com.alterdekim.javabot.entities.Synergy;
|
||||||
|
import com.alterdekim.javabot.entities.Work;
|
||||||
|
import com.alterdekim.javabot.repository.WorkRepository;
|
||||||
|
import org.springframework.stereotype.Service;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
@Service
|
||||||
|
public class WorkServiceImpl implements WorkService {
|
||||||
|
|
||||||
|
private final WorkRepository repository;
|
||||||
|
|
||||||
|
public WorkServiceImpl(WorkRepository repository) {
|
||||||
|
this.repository = repository;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public List<Work> getAllWorks() {
|
||||||
|
return repository.findAll();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Work getWorkById(long workId) {
|
||||||
|
return repository.findById(workId).orElse(null);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void removeById(long workId) {
|
||||||
|
repository.deleteById(workId);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void saveWork(Work work) {
|
||||||
|
repository.save(work);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public List<Synergy> getSynergies(Long id) {
|
||||||
|
return repository.getSynergies(id);
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,106 @@
|
|||||||
|
package com.alterdekim.javabot.storage;
|
||||||
|
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.io.InputStream;
|
||||||
|
import java.nio.file.Files;
|
||||||
|
import java.nio.file.Path;
|
||||||
|
import java.nio.file.Paths;
|
||||||
|
import java.nio.file.StandardCopyOption;
|
||||||
|
import java.util.stream.Stream;
|
||||||
|
|
||||||
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
|
import org.springframework.core.io.ClassPathResource;
|
||||||
|
import org.springframework.core.io.Resource;
|
||||||
|
import org.springframework.stereotype.Service;
|
||||||
|
import org.springframework.util.FileSystemUtils;
|
||||||
|
import org.springframework.web.multipart.MultipartFile;
|
||||||
|
|
||||||
|
@Service
|
||||||
|
public class FileSystemStorageService implements StorageService {
|
||||||
|
|
||||||
|
private final Path rootLocation;
|
||||||
|
|
||||||
|
@Autowired
|
||||||
|
public FileSystemStorageService(StorageProperties properties) {
|
||||||
|
|
||||||
|
if(properties.getLocation().trim().isEmpty()){
|
||||||
|
throw new StorageException("File upload location can not be Empty.");
|
||||||
|
}
|
||||||
|
|
||||||
|
this.rootLocation = Paths.get(new ClassPathResource(properties.getLocation()).getPath());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void store(MultipartFile file) {
|
||||||
|
try {
|
||||||
|
if (file.isEmpty()) {
|
||||||
|
throw new StorageException("Failed to store empty file.");
|
||||||
|
}
|
||||||
|
Path destinationFile = this.rootLocation.resolve(
|
||||||
|
Paths.get(file.getOriginalFilename()))
|
||||||
|
.normalize().toAbsolutePath();
|
||||||
|
if (!destinationFile.getParent().equals(this.rootLocation.toAbsolutePath())) {
|
||||||
|
throw new StorageException(
|
||||||
|
"Cannot store file outside current directory.");
|
||||||
|
}
|
||||||
|
try (InputStream inputStream = file.getInputStream()) {
|
||||||
|
Files.copy(inputStream, destinationFile,
|
||||||
|
StandardCopyOption.REPLACE_EXISTING);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
catch (IOException e) {
|
||||||
|
throw new StorageException("Failed to store file.", e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Stream<Path> loadAll() {
|
||||||
|
try {
|
||||||
|
return Files.walk(this.rootLocation, 1)
|
||||||
|
.filter(path -> !path.equals(this.rootLocation))
|
||||||
|
.map(this.rootLocation::relativize);
|
||||||
|
}
|
||||||
|
catch (IOException e) {
|
||||||
|
throw new StorageException("Failed to read stored files", e);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Path load(String filename) {
|
||||||
|
return rootLocation.resolve(filename);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Resource loadAsResource(String filename) {
|
||||||
|
try {
|
||||||
|
Resource resource = new ClassPathResource(filename);
|
||||||
|
if (resource.exists() || resource.isReadable()) {
|
||||||
|
return resource;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
throw new StorageFileNotFoundException(
|
||||||
|
"Could not read file: " + filename);
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
catch (Exception e) {
|
||||||
|
throw new StorageFileNotFoundException("Could not read file: " + filename, e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void deleteAll() {
|
||||||
|
FileSystemUtils.deleteRecursively(rootLocation.toFile());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void init() {
|
||||||
|
// try {
|
||||||
|
// Files.createDirectories(rootLocation);
|
||||||
|
// }
|
||||||
|
// catch (IOException e) {
|
||||||
|
// throw new StorageException("Could not initialize storage", e);
|
||||||
|
// }
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,13 @@
|
|||||||
|
package com.alterdekim.javabot.storage;
|
||||||
|
|
||||||
|
|
||||||
|
public class StorageException extends RuntimeException {
|
||||||
|
|
||||||
|
public StorageException(String message) {
|
||||||
|
super(message);
|
||||||
|
}
|
||||||
|
|
||||||
|
public StorageException(String message, Throwable cause) {
|
||||||
|
super(message, cause);
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,12 @@
|
|||||||
|
package com.alterdekim.javabot.storage;
|
||||||
|
|
||||||
|
public class StorageFileNotFoundException extends StorageException {
|
||||||
|
|
||||||
|
public StorageFileNotFoundException(String message) {
|
||||||
|
super(message);
|
||||||
|
}
|
||||||
|
|
||||||
|
public StorageFileNotFoundException(String message, Throwable cause) {
|
||||||
|
super(message, cause);
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,13 @@
|
|||||||
|
package com.alterdekim.javabot.storage;
|
||||||
|
|
||||||
|
|
||||||
|
import lombok.Getter;
|
||||||
|
import lombok.Setter;
|
||||||
|
import org.springframework.boot.context.properties.ConfigurationProperties;
|
||||||
|
|
||||||
|
@Setter
|
||||||
|
@Getter
|
||||||
|
@ConfigurationProperties("storage")
|
||||||
|
public class StorageProperties {
|
||||||
|
private String location = "static";
|
||||||
|
}
|
@ -0,0 +1,23 @@
|
|||||||
|
package com.alterdekim.javabot.storage;
|
||||||
|
|
||||||
|
import org.springframework.core.io.Resource;
|
||||||
|
import org.springframework.web.multipart.MultipartFile;
|
||||||
|
|
||||||
|
import java.nio.file.Path;
|
||||||
|
import java.util.stream.Stream;
|
||||||
|
|
||||||
|
public interface StorageService {
|
||||||
|
|
||||||
|
void init();
|
||||||
|
|
||||||
|
void store(MultipartFile file);
|
||||||
|
|
||||||
|
Stream<Path> loadAll();
|
||||||
|
|
||||||
|
Path load(String filename);
|
||||||
|
|
||||||
|
Resource loadAsResource(String filename);
|
||||||
|
|
||||||
|
void deleteAll();
|
||||||
|
|
||||||
|
}
|
99
src/main/java/com/alterdekim/javabot/util/BotUtils.java
Normal file
99
src/main/java/com/alterdekim/javabot/util/BotUtils.java
Normal file
@ -0,0 +1,99 @@
|
|||||||
|
package com.alterdekim.javabot.util;
|
||||||
|
|
||||||
|
import com.alterdekim.javabot.Constants;
|
||||||
|
import com.alterdekim.javabot.bot.InfoSections;
|
||||||
|
import org.telegram.telegrambots.meta.api.objects.replykeyboard.InlineKeyboardMarkup;
|
||||||
|
import org.telegram.telegrambots.meta.api.objects.replykeyboard.buttons.InlineKeyboardButton;
|
||||||
|
|
||||||
|
import java.util.*;
|
||||||
|
|
||||||
|
public class BotUtils {
|
||||||
|
public static InlineKeyboardMarkup getJoinKeyboard() {
|
||||||
|
InlineKeyboardMarkup inlineKeyboardMarkup = new InlineKeyboardMarkup();
|
||||||
|
List<List<InlineKeyboardButton>> columns = new ArrayList<>();
|
||||||
|
InlineKeyboardButton inlineKeyboardButton = new InlineKeyboardButton();
|
||||||
|
inlineKeyboardButton.setText(Constants.JOIN_GAME_BTN);
|
||||||
|
inlineKeyboardButton.setCallbackData(HashUtils.bytesToHex(Constants.JOIN_GAME_BTN.getBytes()));
|
||||||
|
List<InlineKeyboardButton> keyboardButtonsRow1 = new ArrayList<>();
|
||||||
|
keyboardButtonsRow1.add(inlineKeyboardButton);
|
||||||
|
columns.add(keyboardButtonsRow1);
|
||||||
|
InlineKeyboardButton inlineKeyboardButton1 = new InlineKeyboardButton();
|
||||||
|
inlineKeyboardButton1.setText(Constants.START_GAME_BTN);
|
||||||
|
inlineKeyboardButton1.setCallbackData(HashUtils.bytesToHex(Constants.START_GAME_BTN.getBytes()));
|
||||||
|
List<InlineKeyboardButton> keyboardButtonsRow2 = new ArrayList<>();
|
||||||
|
keyboardButtonsRow2.add(inlineKeyboardButton1);
|
||||||
|
columns.add(keyboardButtonsRow2);
|
||||||
|
inlineKeyboardMarkup.setKeyboard(columns);
|
||||||
|
return inlineKeyboardMarkup;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static InlineKeyboardMarkup getShowKeyboard(InfoSections infoSections) {
|
||||||
|
InlineKeyboardMarkup inlineKeyboardMarkup = new InlineKeyboardMarkup();
|
||||||
|
List<List<InlineKeyboardButton>> columns = new ArrayList<>();
|
||||||
|
if( !infoSections.getIsHobbyShowed() ) {
|
||||||
|
InlineKeyboardButton inlineKeyboardButton = new InlineKeyboardButton();
|
||||||
|
inlineKeyboardButton.setText(Constants.HOBBY_BTN);
|
||||||
|
inlineKeyboardButton.setCallbackData(HashUtils.bytesToHex(Constants.HOBBY_BTN.getBytes()));
|
||||||
|
columns.add(Collections.singletonList(inlineKeyboardButton));
|
||||||
|
}
|
||||||
|
if( !infoSections.getIsAgeShowed() ) {
|
||||||
|
InlineKeyboardButton inlineKeyboardButton = new InlineKeyboardButton();
|
||||||
|
inlineKeyboardButton.setText(Constants.AGE_BTN);
|
||||||
|
inlineKeyboardButton.setCallbackData(HashUtils.bytesToHex(Constants.AGE_BTN.getBytes()));
|
||||||
|
columns.add(Collections.singletonList(inlineKeyboardButton));
|
||||||
|
}
|
||||||
|
if( !infoSections.getIsGenderShowed() ) {
|
||||||
|
InlineKeyboardButton inlineKeyboardButton = new InlineKeyboardButton();
|
||||||
|
inlineKeyboardButton.setText(Constants.GENDER_BTN);
|
||||||
|
inlineKeyboardButton.setCallbackData(HashUtils.bytesToHex(Constants.GENDER_BTN.getBytes()));
|
||||||
|
columns.add(Collections.singletonList(inlineKeyboardButton));
|
||||||
|
}
|
||||||
|
if( !infoSections.getIsHealthShowed() ) {
|
||||||
|
InlineKeyboardButton inlineKeyboardButton = new InlineKeyboardButton();
|
||||||
|
inlineKeyboardButton.setText(Constants.HEALTH_BTN);
|
||||||
|
inlineKeyboardButton.setCallbackData(HashUtils.bytesToHex(Constants.HEALTH_BTN.getBytes()));
|
||||||
|
columns.add(Collections.singletonList(inlineKeyboardButton));
|
||||||
|
}
|
||||||
|
if( !infoSections.getIsWorkShowed() ) {
|
||||||
|
InlineKeyboardButton inlineKeyboardButton = new InlineKeyboardButton();
|
||||||
|
inlineKeyboardButton.setText(Constants.WORK_BTN);
|
||||||
|
inlineKeyboardButton.setCallbackData(HashUtils.bytesToHex(Constants.WORK_BTN.getBytes()));
|
||||||
|
columns.add(Collections.singletonList(inlineKeyboardButton));
|
||||||
|
}
|
||||||
|
if( !infoSections.getIsLuggageShowed() ) {
|
||||||
|
InlineKeyboardButton inlineKeyboardButton = new InlineKeyboardButton();
|
||||||
|
inlineKeyboardButton.setText(Constants.LUGG_BTN);
|
||||||
|
inlineKeyboardButton.setCallbackData(HashUtils.bytesToHex(Constants.LUGG_BTN.getBytes()));
|
||||||
|
columns.add(Collections.singletonList(inlineKeyboardButton));
|
||||||
|
}
|
||||||
|
inlineKeyboardMarkup.setKeyboard(columns);
|
||||||
|
return inlineKeyboardMarkup;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static InlineKeyboardMarkup getGameTypeKeyboard() {
|
||||||
|
InlineKeyboardMarkup inlineKeyboardMarkup = new InlineKeyboardMarkup();
|
||||||
|
List<List<InlineKeyboardButton>> columns = new ArrayList<>();
|
||||||
|
InlineKeyboardButton inlineKeyboardButton = new InlineKeyboardButton();
|
||||||
|
inlineKeyboardButton.setText(Constants.PROBABILITY);
|
||||||
|
inlineKeyboardButton.setCallbackData(HashUtils.bytesToHex(Constants.PROBABILITY.getBytes()));
|
||||||
|
List<InlineKeyboardButton> keyboardButtonsRow1 = new ArrayList<>();
|
||||||
|
keyboardButtonsRow1.add(inlineKeyboardButton);
|
||||||
|
columns.add(keyboardButtonsRow1);
|
||||||
|
InlineKeyboardButton inlineKeyboardButton1 = new InlineKeyboardButton();
|
||||||
|
inlineKeyboardButton1.setText(Constants.DEATHMATCH);
|
||||||
|
inlineKeyboardButton1.setCallbackData(HashUtils.bytesToHex(Constants.DEATHMATCH.getBytes()));
|
||||||
|
List<InlineKeyboardButton> keyboardButtonsRow2 = new ArrayList<>();
|
||||||
|
keyboardButtonsRow2.add(inlineKeyboardButton1);
|
||||||
|
columns.add(keyboardButtonsRow2);
|
||||||
|
inlineKeyboardMarkup.setKeyboard(columns);
|
||||||
|
return inlineKeyboardMarkup;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static String mentionUser(String name) {
|
||||||
|
return " @"+name+" ";
|
||||||
|
}
|
||||||
|
|
||||||
|
public static Object getRandomFromList(List list, Random random) {
|
||||||
|
return list.get(random.nextInt(list.size()));
|
||||||
|
}
|
||||||
|
}
|
7
src/main/java/com/alterdekim/javabot/util/Clamp.java
Normal file
7
src/main/java/com/alterdekim/javabot/util/Clamp.java
Normal file
@ -0,0 +1,7 @@
|
|||||||
|
package com.alterdekim.javabot.util;
|
||||||
|
|
||||||
|
public class Clamp {
|
||||||
|
public static double clamp(double value, double min, double max) {
|
||||||
|
return Math.max(min, Math.min(max, value));
|
||||||
|
}
|
||||||
|
}
|
7
src/main/java/com/alterdekim/javabot/util/GameState.java
Normal file
7
src/main/java/com/alterdekim/javabot/util/GameState.java
Normal file
@ -0,0 +1,7 @@
|
|||||||
|
package com.alterdekim.javabot.util;
|
||||||
|
|
||||||
|
public enum GameState {
|
||||||
|
NONE,
|
||||||
|
JOINING,
|
||||||
|
STARTED
|
||||||
|
}
|
59
src/main/java/com/alterdekim/javabot/util/HashUtils.java
Normal file
59
src/main/java/com/alterdekim/javabot/util/HashUtils.java
Normal file
@ -0,0 +1,59 @@
|
|||||||
|
package com.alterdekim.javabot.util;
|
||||||
|
|
||||||
|
import lombok.extern.slf4j.Slf4j;
|
||||||
|
|
||||||
|
import java.nio.charset.StandardCharsets;
|
||||||
|
import java.security.MessageDigest;
|
||||||
|
|
||||||
|
@Slf4j
|
||||||
|
public class HashUtils {
|
||||||
|
public static String md5(String s) {
|
||||||
|
try {
|
||||||
|
MessageDigest md = MessageDigest.getInstance("MD5");
|
||||||
|
byte[] theMD5digest = md.digest(s.getBytes(StandardCharsets.UTF_8));
|
||||||
|
return bytesToHex(theMD5digest);
|
||||||
|
} catch ( Exception e ) {
|
||||||
|
log.error(e.getMessage());
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static byte[] decodeHexString(String hexString) {
|
||||||
|
if (hexString.length() % 2 == 1) {
|
||||||
|
throw new IllegalArgumentException(
|
||||||
|
"Invalid hexadecimal String supplied.");
|
||||||
|
}
|
||||||
|
|
||||||
|
byte[] bytes = new byte[hexString.length() / 2];
|
||||||
|
for (int i = 0; i < hexString.length(); i += 2) {
|
||||||
|
bytes[i / 2] = hexToByte(hexString.substring(i, i + 2));
|
||||||
|
}
|
||||||
|
return bytes;
|
||||||
|
}
|
||||||
|
|
||||||
|
private static byte hexToByte(String hexString) {
|
||||||
|
int firstDigit = toDigit(hexString.charAt(0));
|
||||||
|
int secondDigit = toDigit(hexString.charAt(1));
|
||||||
|
return (byte) ((firstDigit << 4) + secondDigit);
|
||||||
|
}
|
||||||
|
|
||||||
|
private static int toDigit(char hexChar) {
|
||||||
|
int digit = Character.digit(hexChar, 16);
|
||||||
|
if(digit == -1) {
|
||||||
|
throw new IllegalArgumentException(
|
||||||
|
"Invalid Hexadecimal Character: "+ hexChar);
|
||||||
|
}
|
||||||
|
return digit;
|
||||||
|
}
|
||||||
|
|
||||||
|
private static final byte[] HEX_ARRAY = "0123456789ABCDEF".getBytes(StandardCharsets.US_ASCII);
|
||||||
|
public static String bytesToHex(byte[] bytes) {
|
||||||
|
byte[] hexChars = new byte[bytes.length * 2];
|
||||||
|
for (int j = 0; j < bytes.length; j++) {
|
||||||
|
int v = bytes[j] & 0xFF;
|
||||||
|
hexChars[j * 2] = HEX_ARRAY[v >>> 4];
|
||||||
|
hexChars[j * 2 + 1] = HEX_ARRAY[v & 0x0F];
|
||||||
|
}
|
||||||
|
return new String(hexChars, StandardCharsets.UTF_8);
|
||||||
|
}
|
||||||
|
}
|
27
src/main/java/com/alterdekim/javabot/util/PseudoRandom.java
Normal file
27
src/main/java/com/alterdekim/javabot/util/PseudoRandom.java
Normal file
@ -0,0 +1,27 @@
|
|||||||
|
package com.alterdekim.javabot.util;
|
||||||
|
|
||||||
|
public class PseudoRandom {
|
||||||
|
private final double seed;
|
||||||
|
|
||||||
|
private double i = 0;
|
||||||
|
|
||||||
|
public PseudoRandom( double seed ) {
|
||||||
|
assert seed > 0 && seed < 1;
|
||||||
|
this.seed = seed;
|
||||||
|
}
|
||||||
|
|
||||||
|
public PseudoRandom() {
|
||||||
|
this.seed = 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
public double next() {
|
||||||
|
double f = ((Math.cos(3d * i) * Math.cos(3d * i) * Math.sin(3d * i)) * 1.3333d * Math.cos(i) * Math.cos(i)) + 0.5d;
|
||||||
|
i += seed;
|
||||||
|
i = i % 6.2d;
|
||||||
|
return f;
|
||||||
|
}
|
||||||
|
|
||||||
|
public int nextInt(int bound) {
|
||||||
|
return (int) Math.floor(next() * ((double) bound));
|
||||||
|
}
|
||||||
|
}
|
490
src/main/java/com/alterdekim/javabot/util/UAgentInfo.java
Normal file
490
src/main/java/com/alterdekim/javabot/util/UAgentInfo.java
Normal file
@ -0,0 +1,490 @@
|
|||||||
|
package com.alterdekim.javabot.util;
|
||||||
|
|
||||||
|
/* *******************************************
|
||||||
|
// LICENSE INFORMATION
|
||||||
|
// The code, "Detecting Smartphones Using PHP"
|
||||||
|
// by Anthony Hand, is licensed under a Creative Commons
|
||||||
|
// Attribution 3.0 United States License.
|
||||||
|
//
|
||||||
|
// Updated 01 March 2010 by Bryan J Swift
|
||||||
|
// - Remove un-needed if statements instead just returning the boolean
|
||||||
|
// inside the if clause
|
||||||
|
//
|
||||||
|
// Updated 14 December 2009 by A Hand
|
||||||
|
// - Added the method for detecting BlackBerry Touch
|
||||||
|
// devices like the Storm 1 and 2.
|
||||||
|
//
|
||||||
|
// Updated 5 December 2009 by A Hand
|
||||||
|
// - Fixed the DetectPalmOS method. It should filter
|
||||||
|
// out WebOS devices.
|
||||||
|
//
|
||||||
|
// Updated 8 November 2009 by A Hand
|
||||||
|
// - Added the deviceWebOS variable.
|
||||||
|
// - Added Palm's WebOS to the DetectPalmOS method.
|
||||||
|
// - Created a new method to check for Palm's WebOS devices.
|
||||||
|
// - Added Palm's WebOS to the DetectTierIphone method.
|
||||||
|
//
|
||||||
|
// Updated 4 April 2009 by A Hand
|
||||||
|
// - Changed the name of the class from DetectSmartPhone to UAgentInfo.
|
||||||
|
// New name is more consistent with PHP and JavaScript classes.
|
||||||
|
// - Added a method to detect Opera Mobile and Mini. Opera Mobile is new.
|
||||||
|
// - Updated the algorithm for detecting a Sony Mylo.
|
||||||
|
// - Added Android to the DetectTierIphone method.
|
||||||
|
// - Updated comments for Detect Tier methods.
|
||||||
|
//
|
||||||
|
// Updated 22 January 2009
|
||||||
|
// - Ported to Java from the PHP code by
|
||||||
|
// Satish Kumar Nookala, javasatish@yahoo.com
|
||||||
|
//
|
||||||
|
// Anthony Hand, ahand@hand-interactive.com
|
||||||
|
// Web: www.hand-interactive.com
|
||||||
|
//
|
||||||
|
// License info: http://creativecommons.org/licenses/by/3.0/us/
|
||||||
|
//
|
||||||
|
// This code is provided AS IS with no expressed or implied warranty.
|
||||||
|
// You have the right to use this code or any portion of it
|
||||||
|
// so long as you provide credit toward myself as the original author.
|
||||||
|
//
|
||||||
|
// *******************************************
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The DetectSmartPhone class encapsulates information about
|
||||||
|
* a browser's connection to your web site.
|
||||||
|
* You can use it to find out whether the browser asking for
|
||||||
|
* your site's content is probably running on a mobile device.
|
||||||
|
* The methods were written so you can be as granular as you want.
|
||||||
|
* For example, enquiring whether it's as specific as an iPod Touch or
|
||||||
|
* as general as a smartphone class device.
|
||||||
|
* The object's methods return true, or false.
|
||||||
|
*/
|
||||||
|
public class UAgentInfo {
|
||||||
|
// User-Agent and Accept HTTP request headers
|
||||||
|
private String userAgent = "";
|
||||||
|
private String httpAccept = "";
|
||||||
|
|
||||||
|
// Initialize some initial smartphone string variables.
|
||||||
|
public static final String engineWebKit = "webkit";
|
||||||
|
public static final String deviceAndroid = "android";
|
||||||
|
public static final String deviceIphone = "iphone";
|
||||||
|
public static final String deviceIpod = "ipod";
|
||||||
|
public static final String deviceSymbian = "symbian";
|
||||||
|
public static final String deviceS60 = "series60";
|
||||||
|
public static final String deviceS70 = "series70";
|
||||||
|
public static final String deviceS80 = "series80";
|
||||||
|
public static final String deviceS90 = "series90";
|
||||||
|
public static final String deviceWinMob = "windows ce";
|
||||||
|
public static final String deviceWindows = "windows";
|
||||||
|
public static final String deviceIeMob = "iemobile";
|
||||||
|
public static final String enginePie = "wm5 pie"; //An old Windows Mobile
|
||||||
|
public static final String deviceBB = "blackberry";
|
||||||
|
public static final String vndRIM = "vnd.rim"; //Detectable when BB devices emulate IE or Firefox
|
||||||
|
public static final String deviceBBStorm = "blackberry95"; //Storm 1 and 2
|
||||||
|
public static final String devicePalm = "palm";
|
||||||
|
public static final String deviceWebOS = "webos"; //For Palm's new WebOS devices
|
||||||
|
|
||||||
|
public static final String engineBlazer = "blazer"; //Old Palm
|
||||||
|
public static final String engineXiino = "xiino"; //Another old Palm
|
||||||
|
|
||||||
|
//Initialize variables for mobile-specific content.
|
||||||
|
public static final String vndwap = "vnd.wap";
|
||||||
|
public static final String wml = "wml";
|
||||||
|
|
||||||
|
//Initialize variables for other random devices and mobile browsers.
|
||||||
|
public static final String deviceBrew = "brew";
|
||||||
|
public static final String deviceDanger = "danger";
|
||||||
|
public static final String deviceHiptop = "hiptop";
|
||||||
|
public static final String devicePlaystation = "playstation";
|
||||||
|
public static final String deviceNintendoDs = "nitro";
|
||||||
|
public static final String deviceNintendo = "nintendo";
|
||||||
|
public static final String deviceWii = "wii";
|
||||||
|
public static final String deviceXbox = "xbox";
|
||||||
|
public static final String deviceArchos = "archos";
|
||||||
|
|
||||||
|
public static final String engineOpera = "opera"; //Popular browser
|
||||||
|
public static final String engineNetfront = "netfront"; //Common embedded OS browser
|
||||||
|
public static final String engineUpBrowser = "up.browser"; //common on some phones
|
||||||
|
public static final String engineOpenWeb = "openweb"; //Transcoding by OpenWave server
|
||||||
|
public static final String deviceMidp = "midp"; //a mobile Java technology
|
||||||
|
public static final String uplink = "up.link";
|
||||||
|
|
||||||
|
public static final String devicePda = "pda"; //some devices report themselves as PDAs
|
||||||
|
public static final String mini = "mini"; //Some mobile browsers put "mini" in their names.
|
||||||
|
public static final String mobile = "mobile"; //Some mobile browsers put "mobile" in their user agent strings.
|
||||||
|
public static final String mobi = "mobi"; //Some mobile browsers put "mobi" in their user agent strings.
|
||||||
|
|
||||||
|
//Use Maemo, Tablet, and Linux to test for Nokia"s Internet Tablets.
|
||||||
|
public static final String maemo = "maemo";
|
||||||
|
public static final String maemoTablet = "tablet";
|
||||||
|
public static final String linux = "linux";
|
||||||
|
public static final String qtembedded = "qt embedded"; //for Sony Mylo
|
||||||
|
public static final String mylocom2 = "com2"; //for Sony Mylo also
|
||||||
|
|
||||||
|
//In some UserAgents, the only clue is the manufacturer.
|
||||||
|
public static final String manuSonyEricsson = "sonyericsson";
|
||||||
|
public static final String manuericsson = "ericsson";
|
||||||
|
public static final String manuSamsung1 = "sec-sgh";
|
||||||
|
public static final String manuSony = "sony";
|
||||||
|
|
||||||
|
//In some UserAgents, the only clue is the operator.
|
||||||
|
public static final String svcDocomo = "docomo";
|
||||||
|
public static final String svcKddi = "kddi";
|
||||||
|
public static final String svcVodafone = "vodafone";
|
||||||
|
|
||||||
|
// Standard desktop browser detection strings
|
||||||
|
public static final String msie = "MSIE";
|
||||||
|
public static final String msie60 = "MSIE 6.0";
|
||||||
|
public static final String msie61 = "MSIE 6.1";
|
||||||
|
public static final String msie70 = "MSIE 7.0";
|
||||||
|
public static final String msie8 = "MSIE 8.0";
|
||||||
|
public static final String msie9 = "MSIE 9.0";
|
||||||
|
/**
|
||||||
|
* Initialize the userAgent and httpAccept variables
|
||||||
|
*
|
||||||
|
* @param userAgent the User-Agent header
|
||||||
|
* @param httpAccept the Accept header
|
||||||
|
*/
|
||||||
|
public UAgentInfo(String userAgent, String httpAccept) {
|
||||||
|
if (userAgent != null) {
|
||||||
|
this.userAgent = userAgent.toLowerCase();
|
||||||
|
}
|
||||||
|
if (httpAccept != null) {
|
||||||
|
this.httpAccept = httpAccept.toLowerCase();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Return the lower case HTTP_USER_AGENT
|
||||||
|
*/
|
||||||
|
public String getUserAgent() {
|
||||||
|
return userAgent;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Return the lower case HTTP_ACCEPT
|
||||||
|
*/
|
||||||
|
public String getHttpAccept() {
|
||||||
|
return httpAccept;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Detects if the current device is an iPhone.
|
||||||
|
*/
|
||||||
|
public boolean detectIphone() {
|
||||||
|
// The iPod touch says it's an iPhone! So let's disambiguate.
|
||||||
|
return userAgent.indexOf(deviceIphone) != -1 && !detectIpod();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Detects if the current device is an iPod Touch.
|
||||||
|
*/
|
||||||
|
public boolean detectIpod() {
|
||||||
|
return userAgent.indexOf(deviceIpod) != -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Detects if the current device is an iPhone or iPod Touch.
|
||||||
|
*/
|
||||||
|
public boolean detectIphoneOrIpod() {
|
||||||
|
//We repeat the searches here because some iPods may report themselves as an iPhone, which would be okay.
|
||||||
|
return userAgent.indexOf(deviceIphone) != -1 || userAgent.indexOf(deviceIpod) != -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Detects if the current device is an Android OS-based device.
|
||||||
|
*/
|
||||||
|
public boolean detectAndroid() {
|
||||||
|
return userAgent.indexOf(deviceAndroid) != -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Detects if the current device is an Android OS-based device and
|
||||||
|
* the browser is based on WebKit.
|
||||||
|
*/
|
||||||
|
public boolean detectAndroidWebKit() {
|
||||||
|
return detectAndroid() && detectWebkit();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Detects if the current browser is based on WebKit.
|
||||||
|
*/
|
||||||
|
public boolean detectWebkit() {
|
||||||
|
return userAgent.indexOf(engineWebKit) != -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Detects if the current browser is the S60 Open Source Browser.
|
||||||
|
*/
|
||||||
|
public boolean detectS60OssBrowser() {
|
||||||
|
//First, test for WebKit, then make sure it's either Symbian or S60.
|
||||||
|
return detectWebkit() && (userAgent.indexOf(deviceSymbian) != -1 || userAgent.indexOf(deviceS60) != -1);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* Detects if the current device is any Symbian OS-based device,
|
||||||
|
* including older S60, Series 70, Series 80, Series 90, and UIQ,
|
||||||
|
* or other browsers running on these devices.
|
||||||
|
*/
|
||||||
|
public boolean detectSymbianOS() {
|
||||||
|
return userAgent.indexOf(deviceSymbian) != -1 || userAgent.indexOf(deviceS60) != -1 ||
|
||||||
|
userAgent.indexOf(deviceS70) != -1 || userAgent.indexOf(deviceS80) != -1 ||
|
||||||
|
userAgent.indexOf(deviceS90) != -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Detects if the current browser is a Windows Mobile device.
|
||||||
|
*/
|
||||||
|
public boolean detectWindowsMobile() {
|
||||||
|
//Most devices use 'Windows CE', but some report 'iemobile'
|
||||||
|
// and some older ones report as 'PIE' for Pocket IE.
|
||||||
|
return userAgent.indexOf(deviceWinMob) != -1 ||
|
||||||
|
userAgent.indexOf(deviceIeMob) != -1 ||
|
||||||
|
userAgent.indexOf(enginePie) != -1 ||
|
||||||
|
(detectWapWml() && userAgent.indexOf(deviceWindows) != -1);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Detects if the current browser is a BlackBerry of some sort.
|
||||||
|
*/
|
||||||
|
public boolean detectBlackBerry() {
|
||||||
|
return userAgent.indexOf(deviceBB) != -1 || httpAccept.indexOf(vndRIM) != -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Detects if the current browser is a BlackBerry Touch
|
||||||
|
* device, such as the Storm
|
||||||
|
*/
|
||||||
|
public boolean detectBlackBerryTouch() {
|
||||||
|
return userAgent.indexOf(deviceBBStorm) != -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Detects if the current browser is on a PalmOS device.
|
||||||
|
*/
|
||||||
|
public boolean detectPalmOS() {
|
||||||
|
//Most devices nowadays report as 'Palm', but some older ones reported as Blazer or Xiino.
|
||||||
|
if (userAgent.indexOf(devicePalm) != -1 || userAgent.indexOf(engineBlazer) != -1 ||
|
||||||
|
userAgent.indexOf(engineXiino) != -1 && !detectPalmWebOS()) {
|
||||||
|
//Make sure it's not WebOS first
|
||||||
|
if (detectPalmWebOS()) { return false; }
|
||||||
|
else { return true; }
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Detects if the current browser is on a Palm device
|
||||||
|
* running the new WebOS.
|
||||||
|
*/
|
||||||
|
public boolean detectPalmWebOS() {
|
||||||
|
return userAgent.indexOf(deviceWebOS) != -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Check to see whether the device is any device
|
||||||
|
* in the 'smartphone' category.
|
||||||
|
*/
|
||||||
|
public boolean detectSmartphone() {
|
||||||
|
return (detectIphoneOrIpod() ||
|
||||||
|
detectS60OssBrowser() ||
|
||||||
|
detectSymbianOS() ||
|
||||||
|
detectWindowsMobile() ||
|
||||||
|
detectBlackBerry() ||
|
||||||
|
detectPalmOS() ||
|
||||||
|
detectPalmWebOS() ||
|
||||||
|
detectAndroid());
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Detects whether the device is a Brew-powered device.
|
||||||
|
*/
|
||||||
|
public boolean detectBrewDevice() {
|
||||||
|
return userAgent.indexOf(deviceBrew) != -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Detects the Danger Hiptop device.
|
||||||
|
*/
|
||||||
|
public boolean detectDangerHiptop() {
|
||||||
|
return userAgent.indexOf(deviceDanger) != -1 || userAgent.indexOf(deviceHiptop) != -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Detects Opera Mobile or Opera Mini.
|
||||||
|
* Added by AHand
|
||||||
|
*/
|
||||||
|
public boolean detectOperaMobile() {
|
||||||
|
return userAgent.indexOf(engineOpera) != -1 && (userAgent.indexOf(mini) != -1 || userAgent.indexOf(mobi) != -1);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Detects whether the device supports WAP or WML.
|
||||||
|
*/
|
||||||
|
public boolean detectWapWml() {
|
||||||
|
return httpAccept.indexOf(vndwap) != -1 || httpAccept.indexOf(wml) != -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The quick way to detect for a mobile device.
|
||||||
|
* Will probably detect most recent/current mid-tier Feature Phones
|
||||||
|
* as well as smartphone-class devices.
|
||||||
|
*/
|
||||||
|
public boolean detectMobileQuick() {
|
||||||
|
//Ordered roughly by market share, WAP/XML > Brew > Smartphone.
|
||||||
|
if (detectWapWml()) { return true; }
|
||||||
|
if (detectBrewDevice()) { return true; }
|
||||||
|
|
||||||
|
// Updated by AHand
|
||||||
|
if (detectOperaMobile()) { return true; }
|
||||||
|
|
||||||
|
if (userAgent.indexOf(engineUpBrowser) != -1) { return true; }
|
||||||
|
if (userAgent.indexOf(engineOpenWeb) != -1) { return true; }
|
||||||
|
if (userAgent.indexOf(deviceMidp) != -1) { return true; }
|
||||||
|
|
||||||
|
if (detectSmartphone()) { return true; }
|
||||||
|
if (detectDangerHiptop()) { return true; }
|
||||||
|
|
||||||
|
if (detectMidpCapable()) { return true; }
|
||||||
|
|
||||||
|
if (userAgent.indexOf(devicePda) != -1) { return true; }
|
||||||
|
if (userAgent.indexOf(mobile) != -1) { return true; }
|
||||||
|
|
||||||
|
//detect older phones from certain manufacturers and operators.
|
||||||
|
if (userAgent.indexOf(uplink) != -1) { return true; }
|
||||||
|
if (userAgent.indexOf(manuSonyEricsson) != -1) { return true; }
|
||||||
|
if (userAgent.indexOf(manuericsson) != -1) { return true; }
|
||||||
|
if (userAgent.indexOf(manuSamsung1) != -1) { return true; }
|
||||||
|
if (userAgent.indexOf(svcDocomo) != -1) { return true; }
|
||||||
|
if (userAgent.indexOf(svcKddi) != -1) { return true; }
|
||||||
|
if (userAgent.indexOf(svcVodafone) != -1) { return true; }
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Detects if the current device is a Sony Playstation.
|
||||||
|
*/
|
||||||
|
public boolean detectSonyPlaystation() {
|
||||||
|
return userAgent.indexOf(devicePlaystation) != -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Detects if the current device is a Nintendo game device.
|
||||||
|
*/
|
||||||
|
public boolean detectNintendo() {
|
||||||
|
return userAgent.indexOf(deviceNintendo) != -1 || userAgent.indexOf(deviceWii) != -1 ||
|
||||||
|
userAgent.indexOf(deviceNintendoDs) != -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Detects if the current device is a Microsoft Xbox.
|
||||||
|
*/
|
||||||
|
public boolean detectXbox() {
|
||||||
|
return userAgent.indexOf(deviceXbox) != -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Detects if the current device is an Internet-capable game console.
|
||||||
|
*/
|
||||||
|
public boolean detectGameConsole() {
|
||||||
|
return detectSonyPlaystation() || detectNintendo() || detectXbox();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Detects if the current device supports MIDP, a mobile Java technology.
|
||||||
|
*/
|
||||||
|
public boolean detectMidpCapable() {
|
||||||
|
return userAgent.indexOf(deviceMidp) != -1 || httpAccept.indexOf(deviceMidp) != -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Detects if the current device is on one of the Maemo-based Nokia Internet Tablets.
|
||||||
|
*/
|
||||||
|
public boolean detectMaemoTablet() {
|
||||||
|
return (userAgent.indexOf(maemo) != -1 || (userAgent.indexOf(maemoTablet) != -1 && userAgent.indexOf(linux) != -1));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Detects if the current device is an Archos media player/Internet tablet.
|
||||||
|
*/
|
||||||
|
public boolean detectArchos() {
|
||||||
|
return userAgent.indexOf(deviceArchos) != -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Detects if the current browser is a Sony Mylo device.
|
||||||
|
* Updated by AHand
|
||||||
|
*/
|
||||||
|
public boolean detectSonyMylo() {
|
||||||
|
return userAgent.indexOf(manuSony) != -1 && (userAgent.indexOf(qtembedded) != -1 ||
|
||||||
|
userAgent.indexOf(mylocom2) != -1);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The longer and more thorough way to detect for a mobile device.
|
||||||
|
* Will probably detect most feature phones,
|
||||||
|
* smartphone-class devices, Internet Tablets,
|
||||||
|
* Internet-enabled game consoles, etc.
|
||||||
|
* This ought to catch a lot of the more obscure and older devices, also --
|
||||||
|
* but no promises on thoroughness!
|
||||||
|
*/
|
||||||
|
public boolean detectMobileLong() {
|
||||||
|
return detectMobileQuick() || detectMaemoTablet() || detectGameConsole();
|
||||||
|
}
|
||||||
|
|
||||||
|
//*****************************
|
||||||
|
// For Desktop Browsers
|
||||||
|
//*****************************
|
||||||
|
public boolean detectMSIE() {
|
||||||
|
return userAgent.indexOf(msie) != -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean detectMSIE6() {
|
||||||
|
return userAgent.indexOf(msie60) != -1 && userAgent.indexOf(msie61) != -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean detectMSIE7() {
|
||||||
|
return userAgent.indexOf(msie70) != -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean detectMSIE8() {
|
||||||
|
return userAgent.indexOf(msie8) != -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean detectMSIE9() {
|
||||||
|
return userAgent.indexOf(msie9) != -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
//*****************************
|
||||||
|
// For Mobile Web Site Design
|
||||||
|
//*****************************
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The quick way to detect for a tier of devices.
|
||||||
|
* This method detects for devices which can
|
||||||
|
* display iPhone-optimized web content.
|
||||||
|
* Includes iPhone, iPod Touch, Android, Palm WebOS, etc.
|
||||||
|
*/
|
||||||
|
public boolean detectTierIphone() {
|
||||||
|
return detectIphoneOrIpod() || detectPalmWebOS() || detectAndroid() || detectAndroidWebKit();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The quick way to detect for a tier of devices.
|
||||||
|
* This method detects for all smartphones, but
|
||||||
|
* excludes the iPhone Tier devices.
|
||||||
|
*/
|
||||||
|
public boolean detectTierSmartphones() {
|
||||||
|
return detectSmartphone() && (!detectTierIphone());
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The quick way to detect for a tier of devices.
|
||||||
|
* This method detects for all other types of phones,
|
||||||
|
* but excludes the iPhone and Smartphone Tier devices.
|
||||||
|
*/
|
||||||
|
public boolean detectTierOtherPhones() {
|
||||||
|
return detectMobileQuick() && (!detectTierIphone()) && (!detectTierSmartphones());
|
||||||
|
}
|
||||||
|
}
|
57
src/main/resources/messages_en.properties
Normal file
57
src/main/resources/messages_en.properties
Normal file
@ -0,0 +1,57 @@
|
|||||||
|
signup=Sign up
|
||||||
|
signin=Sign in
|
||||||
|
remember=Remember me
|
||||||
|
pass=Password
|
||||||
|
nname=Nickname
|
||||||
|
login_error=Incorrect nickname or password
|
||||||
|
invitecode=Invite code
|
||||||
|
incorcred=Incorrect credentials
|
||||||
|
logote=Logout
|
||||||
|
rlang=Russian
|
||||||
|
elang=English
|
||||||
|
langl=Language
|
||||||
|
abby=Abilities
|
||||||
|
diss=Disasters
|
||||||
|
lugg=Luggage
|
||||||
|
heeal=Health
|
||||||
|
pprof=Profession
|
||||||
|
hhobb=Hobby
|
||||||
|
aggend=Gender
|
||||||
|
addata=Additional Data
|
||||||
|
pplay=Player
|
||||||
|
hhome=Home
|
||||||
|
aaccden=Access denied
|
||||||
|
oopsi=Opps!
|
||||||
|
badway= You're in a bad way.
|
||||||
|
light=Light
|
||||||
|
dark=Dark
|
||||||
|
auto=Auto
|
||||||
|
toggleth=Toggle theme
|
||||||
|
aedentry=Add(or edit) entry
|
||||||
|
inlcandie=Can die?
|
||||||
|
inlcfr=Childfree?
|
||||||
|
inlismal=Male?
|
||||||
|
inlisfem=Female?
|
||||||
|
inlgente=Gender label:
|
||||||
|
inlfood=Food
|
||||||
|
inlheal=Asocial
|
||||||
|
inlpower=Power
|
||||||
|
inlviol=Violence
|
||||||
|
hobblab=Hobby label:
|
||||||
|
inlgarb=Garbage?
|
||||||
|
inlaname=Name label:
|
||||||
|
inladesc=Description label:
|
||||||
|
inlhin=Health index
|
||||||
|
cancbt=Cancel
|
||||||
|
adddbtn=Add
|
||||||
|
edditbtn=Edit
|
||||||
|
remombtn=Remove
|
||||||
|
inlprobbb=Add probability
|
||||||
|
eddittsynn=Edit synergies
|
||||||
|
firentname=First entity name
|
||||||
|
firenttype=First entity type
|
||||||
|
secentname=Second entity name
|
||||||
|
secenttype=Second entity type
|
||||||
|
probbval=Probability value
|
||||||
|
actionbtn=Action
|
||||||
|
stats=Statistics
|
57
src/main/resources/messages_ru.properties
Normal file
57
src/main/resources/messages_ru.properties
Normal file
@ -0,0 +1,57 @@
|
|||||||
|
signup=Регистрация
|
||||||
|
signin=Войти
|
||||||
|
remember=Запомнить
|
||||||
|
pass=Пароль
|
||||||
|
nname=Ник
|
||||||
|
login_error=Неправильный ник или пароль
|
||||||
|
invitecode=Инвайт
|
||||||
|
incorcred=Неправильные данные
|
||||||
|
logote=Выйти
|
||||||
|
rlang=Русский
|
||||||
|
elang=Английский
|
||||||
|
langl=Язык
|
||||||
|
abby=Способности
|
||||||
|
diss=Катастрофы
|
||||||
|
lugg=Багаж
|
||||||
|
heeal=Здоровье
|
||||||
|
pprof=Профессия
|
||||||
|
hhobb=Хобби
|
||||||
|
aggend=Гендер
|
||||||
|
addata=Факты
|
||||||
|
pplay=Игрок
|
||||||
|
hhome=Главная
|
||||||
|
aaccden=Доступ запрещен
|
||||||
|
oopsi=Упс!
|
||||||
|
badway= Вас сюда не звали.
|
||||||
|
light=Светлая
|
||||||
|
dark=Тёмная
|
||||||
|
auto=Авто
|
||||||
|
toggleth=Переключить
|
||||||
|
aedentry=Добавить/изменить запись
|
||||||
|
inlcandie=Может умереть?
|
||||||
|
inlcfr=Бесплоден?
|
||||||
|
inlismal=Мужчина?
|
||||||
|
inlisfem=Женщина?
|
||||||
|
inlgente=Гендер(текст):
|
||||||
|
inlfood=Еда
|
||||||
|
inlheal=Асоциальность
|
||||||
|
inlpower=Сила
|
||||||
|
inlviol=Насилие
|
||||||
|
hobblab=Название хобби:
|
||||||
|
inlgarb=Мусор?
|
||||||
|
inlaname=Имя:
|
||||||
|
inladesc=Описание:
|
||||||
|
inlhin=Здоровье
|
||||||
|
cancbt=Отмена
|
||||||
|
adddbtn=Добавить
|
||||||
|
edditbtn=Изменить
|
||||||
|
remombtn=Удалить
|
||||||
|
inlprobbb=Add probability
|
||||||
|
eddittsynn=Синергии
|
||||||
|
firentname=Имя первой вещи
|
||||||
|
firenttype=Тип первой вещи
|
||||||
|
secentname=Имя второй вещи
|
||||||
|
secenttype=Тип второй вещи
|
||||||
|
probbval=Вероятность(знач)
|
||||||
|
actionbtn=Действие
|
||||||
|
stats=Статистика
|
4
src/main/resources/static/css/panel.css
Normal file
4
src/main/resources/static/css/panel.css
Normal file
@ -0,0 +1,4 @@
|
|||||||
|
html,
|
||||||
|
body {
|
||||||
|
height: 100%;
|
||||||
|
}
|
25
src/main/resources/static/css/sign-in.css
Normal file
25
src/main/resources/static/css/sign-in.css
Normal file
@ -0,0 +1,25 @@
|
|||||||
|
html,
|
||||||
|
body {
|
||||||
|
height: 100%;
|
||||||
|
}
|
||||||
|
|
||||||
|
.form-signin {
|
||||||
|
max-width: 330px;
|
||||||
|
padding: 1rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
.form-signin .form-floating:focus-within {
|
||||||
|
z-index: 2;
|
||||||
|
}
|
||||||
|
|
||||||
|
.form-signin input[type="text"] {
|
||||||
|
margin-bottom: -1px;
|
||||||
|
border-bottom-right-radius: 0;
|
||||||
|
border-bottom-left-radius: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.form-signin input[type="password"] {
|
||||||
|
margin-bottom: 10px;
|
||||||
|
border-top-left-radius: 0;
|
||||||
|
border-top-right-radius: 0;
|
||||||
|
}
|
13
src/main/resources/static/css/sign-up.css
Normal file
13
src/main/resources/static/css/sign-up.css
Normal file
@ -0,0 +1,13 @@
|
|||||||
|
html,
|
||||||
|
body {
|
||||||
|
height: 100%;
|
||||||
|
}
|
||||||
|
|
||||||
|
.form-signup {
|
||||||
|
max-width: 330px;
|
||||||
|
padding: 1rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
.form-signup .form-floating:focus-within {
|
||||||
|
z-index: 2;
|
||||||
|
}
|
8
src/main/resources/static/css/util.css
Normal file
8
src/main/resources/static/css/util.css
Normal file
File diff suppressed because one or more lines are too long
80
src/main/resources/static/javascript/color-modes.js
Normal file
80
src/main/resources/static/javascript/color-modes.js
Normal file
@ -0,0 +1,80 @@
|
|||||||
|
/*!
|
||||||
|
* Color mode toggler for Bootstrap's docs (https://getbootstrap.com/)
|
||||||
|
* Copyright 2011-2023 The Bootstrap Authors
|
||||||
|
* Licensed under the Creative Commons Attribution 3.0 Unported License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
(() => {
|
||||||
|
'use strict'
|
||||||
|
|
||||||
|
const getStoredTheme = () => localStorage.getItem('theme')
|
||||||
|
const setStoredTheme = theme => localStorage.setItem('theme', theme)
|
||||||
|
|
||||||
|
const getPreferredTheme = () => {
|
||||||
|
const storedTheme = getStoredTheme()
|
||||||
|
if (storedTheme) {
|
||||||
|
return storedTheme
|
||||||
|
}
|
||||||
|
|
||||||
|
return window.matchMedia('(prefers-color-scheme: dark)').matches ? 'dark' : 'light'
|
||||||
|
}
|
||||||
|
|
||||||
|
const setTheme = theme => {
|
||||||
|
if (theme === 'auto' && window.matchMedia('(prefers-color-scheme: dark)').matches) {
|
||||||
|
document.documentElement.setAttribute('data-bs-theme', 'dark')
|
||||||
|
} else {
|
||||||
|
document.documentElement.setAttribute('data-bs-theme', theme)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
setTheme(getPreferredTheme())
|
||||||
|
|
||||||
|
const showActiveTheme = (theme, focus = false) => {
|
||||||
|
const themeSwitcher = document.querySelector('#bd-theme')
|
||||||
|
|
||||||
|
if (!themeSwitcher) {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
const themeSwitcherText = document.querySelector('#bd-theme-text')
|
||||||
|
const activeThemeIcon = document.querySelector('.theme-icon-active use')
|
||||||
|
const btnToActive = document.querySelector(`[data-bs-theme-value="${theme}"]`)
|
||||||
|
const svgOfActiveBtn = btnToActive.querySelector('svg use').getAttribute('href')
|
||||||
|
|
||||||
|
document.querySelectorAll('[data-bs-theme-value]').forEach(element => {
|
||||||
|
element.classList.remove('active')
|
||||||
|
element.setAttribute('aria-pressed', 'false')
|
||||||
|
})
|
||||||
|
|
||||||
|
btnToActive.classList.add('active')
|
||||||
|
btnToActive.setAttribute('aria-pressed', 'true')
|
||||||
|
activeThemeIcon.setAttribute('href', svgOfActiveBtn)
|
||||||
|
const themeSwitcherLabel = `${themeSwitcherText.textContent} (${btnToActive.dataset.bsThemeValue})`
|
||||||
|
themeSwitcher.setAttribute('aria-label', themeSwitcherLabel)
|
||||||
|
|
||||||
|
if (focus) {
|
||||||
|
themeSwitcher.focus()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
window.matchMedia('(prefers-color-scheme: dark)').addEventListener('change', () => {
|
||||||
|
const storedTheme = getStoredTheme()
|
||||||
|
if (storedTheme !== 'light' && storedTheme !== 'dark') {
|
||||||
|
setTheme(getPreferredTheme())
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
|
window.addEventListener('DOMContentLoaded', () => {
|
||||||
|
showActiveTheme(getPreferredTheme())
|
||||||
|
|
||||||
|
document.querySelectorAll('[data-bs-theme-value]')
|
||||||
|
.forEach(toggle => {
|
||||||
|
toggle.addEventListener('click', () => {
|
||||||
|
const theme = toggle.getAttribute('data-bs-theme-value')
|
||||||
|
setStoredTheme(theme)
|
||||||
|
setTheme(theme)
|
||||||
|
showActiveTheme(theme, true)
|
||||||
|
})
|
||||||
|
})
|
||||||
|
})
|
||||||
|
})()
|
256
src/main/resources/static/javascript/panel-script.js
Normal file
256
src/main/resources/static/javascript/panel-script.js
Normal file
@ -0,0 +1,256 @@
|
|||||||
|
function str_toHex(s) {
|
||||||
|
// utf8 to latin1
|
||||||
|
var s = unescape(encodeURIComponent(s));
|
||||||
|
var h = '';
|
||||||
|
for (var i = 0; i < s.length; i++) {
|
||||||
|
h += s.charCodeAt(i).toString(16);
|
||||||
|
}
|
||||||
|
return h;
|
||||||
|
}
|
||||||
|
|
||||||
|
function grab_form() {
|
||||||
|
let arr = [];
|
||||||
|
$("form#entryForm :input").each(function() {
|
||||||
|
var input = $(this);
|
||||||
|
let query = "";
|
||||||
|
if(input.attr("type") == "checkbox") {
|
||||||
|
query = input.attr('id') + "=" + input.is(':checked');
|
||||||
|
} else if(input.attr("type") == "text") {
|
||||||
|
var vv = str_toHex(input.val());
|
||||||
|
query = input.attr('id') + "=" + vv;
|
||||||
|
} else {
|
||||||
|
query = input.attr('id') + "=" + input.val();
|
||||||
|
}
|
||||||
|
arr.push(query);
|
||||||
|
});
|
||||||
|
arr.push("section=" + new URL(window.location.href).searchParams.get("section"));
|
||||||
|
return arr.join("&");
|
||||||
|
}
|
||||||
|
|
||||||
|
function add_entry_modal() {
|
||||||
|
$("#modal_submit_edit").css("display", "none");
|
||||||
|
$("#modal_submit_add").css("display", "");
|
||||||
|
}
|
||||||
|
|
||||||
|
function form_agge(jobj) {
|
||||||
|
get_text_api(jobj.genderTextId, function(t) {
|
||||||
|
$("#gender_text").val(t);
|
||||||
|
});
|
||||||
|
$("#ismale").prop('checked', jobj.isMale);
|
||||||
|
$("#isfemale").prop('checked', jobj.isFemale);
|
||||||
|
$("#childFree").prop('checked', jobj.isChildfree);
|
||||||
|
$("#canDie").prop('checked', jobj.canDie);
|
||||||
|
}
|
||||||
|
|
||||||
|
function form_hobb(jobj) {
|
||||||
|
get_text_api(jobj.textDescId, function(t) {
|
||||||
|
$("#hobby_text").val(t);
|
||||||
|
});
|
||||||
|
$("#violenceRange").val(jobj.violence);
|
||||||
|
$("#powerRange").val(jobj.power);
|
||||||
|
$("#healRange").val(jobj.heal);
|
||||||
|
$("#foodRange").val(jobj.food);
|
||||||
|
}
|
||||||
|
|
||||||
|
function form_lugg(jobj) {
|
||||||
|
get_text_api(jobj.textNameId, function(t) {
|
||||||
|
$("#luggage_name_text").val(t);
|
||||||
|
});
|
||||||
|
get_text_api(jobj.textDescId, function(t) {
|
||||||
|
$("#luggage_desc_text").val(t);
|
||||||
|
});
|
||||||
|
$("#violenceRange").val(jobj.violence);
|
||||||
|
$("#powerRange").val(jobj.power);
|
||||||
|
$("#healRange").val(jobj.heal);
|
||||||
|
$("#foodRange").val(jobj.food);
|
||||||
|
$("#isgarbage").prop('checked', jobj.garbage);
|
||||||
|
}
|
||||||
|
|
||||||
|
function form_prof(jobj) {
|
||||||
|
get_text_api(jobj.textNameId, function(t) {
|
||||||
|
$("#work_name_text").val(t);
|
||||||
|
});
|
||||||
|
get_text_api(jobj.textDescId, function(t) {
|
||||||
|
$("#work_desc_text").val(t);
|
||||||
|
});
|
||||||
|
$("#violenceRange").val(jobj.violence);
|
||||||
|
$("#powerRange").val(jobj.power);
|
||||||
|
$("#healRange").val(jobj.heal);
|
||||||
|
$("#foodRange").val(jobj.food);
|
||||||
|
}
|
||||||
|
|
||||||
|
function form_heal(jobj) {
|
||||||
|
get_text_api(jobj.textNameId, function(t) {
|
||||||
|
$("#heal_name_text").val(t);
|
||||||
|
});
|
||||||
|
get_text_api(jobj.textDescId, function(t) {
|
||||||
|
$("#heal_desc_text").val(t);
|
||||||
|
});
|
||||||
|
$("#health_index").val(jobj.health_index);
|
||||||
|
}
|
||||||
|
|
||||||
|
function form_disaster(jobj) {
|
||||||
|
get_text_api(jobj.nameTextId, function(t) {
|
||||||
|
$("#diss_name_text").val(t);
|
||||||
|
});
|
||||||
|
get_text_api(jobj.descTextId, function(t) {
|
||||||
|
$("#diss_desc_text").val(t);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
function show_modal_edit(jobj, oid) {
|
||||||
|
var section = new URL(window.location.href).searchParams.get("section");
|
||||||
|
|
||||||
|
switch(section) {
|
||||||
|
case "agge":
|
||||||
|
form_agge(jobj);
|
||||||
|
break;
|
||||||
|
case "hobb":
|
||||||
|
form_hobb(jobj);
|
||||||
|
break;
|
||||||
|
case "lugg":
|
||||||
|
form_lugg(jobj);
|
||||||
|
break;
|
||||||
|
case "heal":
|
||||||
|
form_heal(jobj);
|
||||||
|
break;
|
||||||
|
case "prof":
|
||||||
|
form_prof(jobj);
|
||||||
|
break;
|
||||||
|
case "diss":
|
||||||
|
form_disaster(jobj);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
form_disaster(jobj);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
$("#modal_submit_edit").css("display", "");
|
||||||
|
$("#modal_submit_add").css("display", "none");
|
||||||
|
$("#modal_submit_edit").attr("data-entry-id", oid);
|
||||||
|
}
|
||||||
|
|
||||||
|
function edit_submit_entry(obj) {
|
||||||
|
$.post("/api/remove_entry", "section="+new URL(window.location.href).searchParams.get("section")+"&entry_id="+($(obj).attr("data-entry-id")), function(data, status) {
|
||||||
|
$.post("/api/add_entry", grab_form(), function(data, status) {
|
||||||
|
window.location.reload();
|
||||||
|
});
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
function edit_entry(obj) {
|
||||||
|
$.post("/api/edit_entry", "section="+new URL(window.location.href).searchParams.get("section")+"&entry_id="+($(obj).attr("data-id")), function(data, status) {
|
||||||
|
var jobj = JSON.parse(data);
|
||||||
|
show_modal_edit(jobj, $(obj).attr("data-id"));
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
function get_text_api(tid, cb) {
|
||||||
|
$.post("/api/getTextById", "entry_id="+tid, function(data, status) {
|
||||||
|
cb(data);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
function remove_entry(obj) {
|
||||||
|
$.post("/api/remove_entry", "section="+new URL(window.location.href).searchParams.get("section")+"&entry_id="+($(obj).attr("data-id")), function(data, status) {
|
||||||
|
window.location.reload();
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
function add_entry() {
|
||||||
|
$.post("/api/add_entry", grab_form(), function(data, status) {
|
||||||
|
window.location.reload();
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
function add_synergy(obj) {
|
||||||
|
let firstEntityId = $(obj).attr("data-id");
|
||||||
|
let firstEntityType = 0;
|
||||||
|
let secondEntityId = $("#second_select_vals").val();
|
||||||
|
let secondEntityType = $("#second_select_types").val();
|
||||||
|
let probabilityValue = $("#synergy_prob_input").val();
|
||||||
|
|
||||||
|
let section = new URL(window.location.href).searchParams.get("section");
|
||||||
|
|
||||||
|
switch(section) {
|
||||||
|
case "agge":
|
||||||
|
firstEntityType = 0;
|
||||||
|
break;
|
||||||
|
case "hobb":
|
||||||
|
firstEntityType = 2;
|
||||||
|
break;
|
||||||
|
case "lugg":
|
||||||
|
firstEntityType = 3;
|
||||||
|
break;
|
||||||
|
case "heal":
|
||||||
|
firstEntityType = 1;
|
||||||
|
break;
|
||||||
|
case "prof":
|
||||||
|
firstEntityType = 4;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
let _set = 0;
|
||||||
|
switch(secondEntityType) {
|
||||||
|
case "agge":
|
||||||
|
_set = 0;
|
||||||
|
break;
|
||||||
|
case "hobb":
|
||||||
|
_set = 2;
|
||||||
|
break;
|
||||||
|
case "lugg":
|
||||||
|
_set = 3;
|
||||||
|
break;
|
||||||
|
case "heal":
|
||||||
|
_set = 1;
|
||||||
|
break;
|
||||||
|
case "prof":
|
||||||
|
_set = 4;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
secondEntityType = _set;
|
||||||
|
$.post("/api/add_synergy", "first_entity_id="+firstEntityId+"&first_entity_type="+firstEntityType+"&second_entity_id="+secondEntityId+"&second_entity_type="+secondEntityType+"&probability="+probabilityValue, function(data, status) {
|
||||||
|
window.location.reload();
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
function show_synergies_modal(obj) {
|
||||||
|
$("#add_synergy_button").attr("data-id", $(obj).attr("data-id"));
|
||||||
|
$(".table_row_generated").remove();
|
||||||
|
$.post("/api/get_synergies", "entity_id="+$(obj).attr("data-id")+"&entity_type="+new URL(window.location.href).searchParams.get("section"), function(data, status) {
|
||||||
|
data = JSON.parse(data);
|
||||||
|
for( let i = 0; i < data.length; i++ ) {
|
||||||
|
$("#table_body_modal").append("<tr class=\"table_row_generated\"><td>"+data[i].firstEntityText+"</td><td>"+data[i].firstType+"</td><td>"+data[i].secondEntityText+"</td><td>"+data[i].secondType+"</td><td>"+data[i].probabilityValue+"</td><td><button type=\"button\" class=\"btn btn-danger\" onclick=\"remove_synergy(this)\" data-synergy-id=\""+data[i].id+"\">Remove</button></td></tr>");
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
function secondTypeChange(obj) {
|
||||||
|
$.post("/api/get_entries", "section="+($(obj).val()), function(data, status) {
|
||||||
|
$("#second_select_vals").html("");
|
||||||
|
let jobj = JSON.parse(data);
|
||||||
|
for( let i = 0; i < jobj.length; i++ ) {
|
||||||
|
let ind = jobj[i];
|
||||||
|
let ss = 0;
|
||||||
|
if( ind.genderTextId != undefined ) {
|
||||||
|
ss = ind.genderTextId;
|
||||||
|
} else if( ind.textNameId != undefined ) {
|
||||||
|
ss = ind.textNameId;
|
||||||
|
} else if( ind.textDescId != undefined ) {
|
||||||
|
ss = ind.textDescId;
|
||||||
|
}
|
||||||
|
|
||||||
|
get_text_api(ss, function(rte) {
|
||||||
|
$("#second_select_vals").append($('<option>', {
|
||||||
|
value: ind.id,
|
||||||
|
text: rte
|
||||||
|
}));
|
||||||
|
});
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
function remove_synergy(obj) {
|
||||||
|
$.post("/api/remove_synergy", "synergy_id="+($(obj).attr("data-synergy-id")), function(data, status) {
|
||||||
|
window.location.reload();
|
||||||
|
});
|
||||||
|
}
|
19
src/main/resources/templates/access-denied.html
Normal file
19
src/main/resources/templates/access-denied.html
Normal file
@ -0,0 +1,19 @@
|
|||||||
|
<!DOCTYPE HTML>
|
||||||
|
<html xmlns:th="http://www.thymeleaf.org">
|
||||||
|
<head>
|
||||||
|
<th:block th:insert="~{fragments/header}"></th:block>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<div th:replace="~{fragments/floating_button}"></div>
|
||||||
|
|
||||||
|
<div class="d-flex align-items-center justify-content-center vh-100">
|
||||||
|
<div class="text-center">
|
||||||
|
<h1 class="display-1 fw-bold" th:text="#{aaccden}"></h1>
|
||||||
|
<p class="fs-3"> <span class="text-danger" th:text="#{oopsi}"></span>[[#{badway}]]</p>
|
||||||
|
<a href="/" class="btn btn-primary" th:text="#{hhome}"></a>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div th:replace="~{fragments/footer :: div}"></div>
|
||||||
|
</body>
|
||||||
|
</html>
|
50
src/main/resources/templates/fragments/floating_button.html
Normal file
50
src/main/resources/templates/fragments/floating_button.html
Normal file
@ -0,0 +1,50 @@
|
|||||||
|
<svg xmlns="http://www.w3.org/2000/svg" class="d-none">
|
||||||
|
<symbol id="check2" viewBox="0 0 16 16">
|
||||||
|
<path d="M13.854 3.646a.5.5 0 0 1 0 .708l-7 7a.5.5 0 0 1-.708 0l-3.5-3.5a.5.5 0 1 1 .708-.708L6.5 10.293l6.646-6.647a.5.5 0 0 1 .708 0z"/>
|
||||||
|
</symbol>
|
||||||
|
<symbol id="circle-half" viewBox="0 0 16 16">
|
||||||
|
<path d="M8 15A7 7 0 1 0 8 1v14zm0 1A8 8 0 1 1 8 0a8 8 0 0 1 0 16z"/>
|
||||||
|
</symbol>
|
||||||
|
<symbol id="moon-stars-fill" viewBox="0 0 16 16">
|
||||||
|
<path d="M6 .278a.768.768 0 0 1 .08.858 7.208 7.208 0 0 0-.878 3.46c0 4.021 3.278 7.277 7.318 7.277.527 0 1.04-.055 1.533-.16a.787.787 0 0 1 .81.316.733.733 0 0 1-.031.893A8.349 8.349 0 0 1 8.344 16C3.734 16 0 12.286 0 7.71 0 4.266 2.114 1.312 5.124.06A.752.752 0 0 1 6 .278z"/>
|
||||||
|
<path d="M10.794 3.148a.217.217 0 0 1 .412 0l.387 1.162c.173.518.579.924 1.097 1.097l1.162.387a.217.217 0 0 1 0 .412l-1.162.387a1.734 1.734 0 0 0-1.097 1.097l-.387 1.162a.217.217 0 0 1-.412 0l-.387-1.162A1.734 1.734 0 0 0 9.31 6.593l-1.162-.387a.217.217 0 0 1 0-.412l1.162-.387a1.734 1.734 0 0 0 1.097-1.097l.387-1.162zM13.863.099a.145.145 0 0 1 .274 0l.258.774c.115.346.386.617.732.732l.774.258a.145.145 0 0 1 0 .274l-.774.258a1.156 1.156 0 0 0-.732.732l-.258.774a.145.145 0 0 1-.274 0l-.258-.774a1.156 1.156 0 0 0-.732-.732l-.774-.258a.145.145 0 0 1 0-.274l.774-.258c.346-.115.617-.386.732-.732L13.863.1z"/>
|
||||||
|
</symbol>
|
||||||
|
<symbol id="sun-fill" viewBox="0 0 16 16">
|
||||||
|
<path d="M8 12a4 4 0 1 0 0-8 4 4 0 0 0 0 8zM8 0a.5.5 0 0 1 .5.5v2a.5.5 0 0 1-1 0v-2A.5.5 0 0 1 8 0zm0 13a.5.5 0 0 1 .5.5v2a.5.5 0 0 1-1 0v-2A.5.5 0 0 1 8 13zm8-5a.5.5 0 0 1-.5.5h-2a.5.5 0 0 1 0-1h2a.5.5 0 0 1 .5.5zM3 8a.5.5 0 0 1-.5.5h-2a.5.5 0 0 1 0-1h2A.5.5 0 0 1 3 8zm10.657-5.657a.5.5 0 0 1 0 .707l-1.414 1.415a.5.5 0 1 1-.707-.708l1.414-1.414a.5.5 0 0 1 .707 0zm-9.193 9.193a.5.5 0 0 1 0 .707L3.05 13.657a.5.5 0 0 1-.707-.707l1.414-1.414a.5.5 0 0 1 .707 0zm9.193 2.121a.5.5 0 0 1-.707 0l-1.414-1.414a.5.5 0 0 1 .707-.707l1.414 1.414a.5.5 0 0 1 0 .707zM4.464 4.465a.5.5 0 0 1-.707 0L2.343 3.05a.5.5 0 1 1 .707-.707l1.414 1.414a.5.5 0 0 1 0 .708z"/>
|
||||||
|
</symbol>
|
||||||
|
</svg>
|
||||||
|
|
||||||
|
<div class="dropdown position-fixed bottom-0 end-0 mb-3 me-3 bd-mode-toggle">
|
||||||
|
<button class="btn btn-bd-primary py-2 dropdown-toggle d-flex align-items-center"
|
||||||
|
id="bd-theme"
|
||||||
|
type="button"
|
||||||
|
aria-expanded="false"
|
||||||
|
data-bs-toggle="dropdown"
|
||||||
|
aria-label="Toggle theme (auto)">
|
||||||
|
<svg class="bi my-1 theme-icon-active" width="1em" height="1em"><use href="#circle-half"></use></svg>
|
||||||
|
<span class="visually-hidden" id="bd-theme-text" th:text="#{toggleth}"></span>
|
||||||
|
</button>
|
||||||
|
<ul class="dropdown-menu dropdown-menu-end shadow" aria-labelledby="bd-theme-text">
|
||||||
|
<li>
|
||||||
|
<button type="button" class="dropdown-item d-flex align-items-center" data-bs-theme-value="light" aria-pressed="false">
|
||||||
|
<svg class="bi me-2 opacity-50 theme-icon" width="1em" height="1em"><use href="#sun-fill"></use></svg>
|
||||||
|
[[#{light}]]
|
||||||
|
<svg class="bi ms-auto d-none" width="1em" height="1em"><use href="#check2"></use></svg>
|
||||||
|
</button>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<button type="button" class="dropdown-item d-flex align-items-center" data-bs-theme-value="dark" aria-pressed="false">
|
||||||
|
<svg class="bi me-2 opacity-50 theme-icon" width="1em" height="1em"><use href="#moon-stars-fill"></use></svg>
|
||||||
|
[[#{dark}]]
|
||||||
|
<svg class="bi ms-auto d-none" width="1em" height="1em"><use href="#check2"></use></svg>
|
||||||
|
</button>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<button type="button" class="dropdown-item d-flex align-items-center active" data-bs-theme-value="auto" aria-pressed="true">
|
||||||
|
<svg class="bi me-2 opacity-50 theme-icon" width="1em" height="1em"><use href="#circle-half"></use></svg>
|
||||||
|
[[#{auto}]]
|
||||||
|
<svg class="bi ms-auto d-none" width="1em" height="1em"><use href="#check2"></use></svg>
|
||||||
|
</button>
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
</div>
|
After Width: | Height: | Size: 4.0 KiB |
5
src/main/resources/templates/fragments/footer.html
Normal file
5
src/main/resources/templates/fragments/footer.html
Normal file
@ -0,0 +1,5 @@
|
|||||||
|
<div>
|
||||||
|
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.2/dist/js/bootstrap.bundle.min.js" integrity="sha384-C6RzsynM9kWDrMNeT87bh95OGNyZPhcTNXj1NW7RuBCsyN/o0jlpcV8Qyq46cDfL" crossorigin="anonymous"></script>
|
||||||
|
<script src="https://cdn.jsdelivr.net/npm/jquery@3.7.1/dist/jquery.min.js"></script>
|
||||||
|
<script src="https://cdn.jsdelivr.net/npm/chart.js@4.4.1/dist/chart.umd.min.js"></script>
|
||||||
|
</div>
|
87
src/main/resources/templates/fragments/header.html
Normal file
87
src/main/resources/templates/fragments/header.html
Normal file
@ -0,0 +1,87 @@
|
|||||||
|
<th:block th:fragment="head">
|
||||||
|
<script type="text/javascript" src="/static/javascript/color-modes.js"></script>
|
||||||
|
<meta charset="UTF-8">
|
||||||
|
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||||
|
<title th:text="${title} ? ${title} : 'Bunker'"></title>
|
||||||
|
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.2/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-T3c6CoIi6uLrA9TneNEoa7RxnatzjcDSCmG1MXxSR1GAsXEV/Dwwykc2MPK8M2HN" crossorigin="anonymous">
|
||||||
|
<link rel="icon" href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAIAAACQd1PeAAAADElEQVQI12P4//8/AAX+Av7czFnnAAAAAElFTkSuQmCC">
|
||||||
|
<meta name="theme-color" content="#712cf9">
|
||||||
|
<style>
|
||||||
|
.bd-placeholder-img {
|
||||||
|
font-size: 1.125rem;
|
||||||
|
text-anchor: middle;
|
||||||
|
-webkit-user-select: none;
|
||||||
|
-moz-user-select: none;
|
||||||
|
user-select: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
@media (min-width: 768px) {
|
||||||
|
.bd-placeholder-img-lg {
|
||||||
|
font-size: 3.5rem;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.b-example-divider {
|
||||||
|
width: 100%;
|
||||||
|
height: 3rem;
|
||||||
|
background-color: rgba(0, 0, 0, .1);
|
||||||
|
border: solid rgba(0, 0, 0, .15);
|
||||||
|
border-width: 1px 0;
|
||||||
|
box-shadow: inset 0 .5em 1.5em rgba(0, 0, 0, .1), inset 0 .125em .5em rgba(0, 0, 0, .15);
|
||||||
|
}
|
||||||
|
|
||||||
|
.b-example-vr {
|
||||||
|
flex-shrink: 0;
|
||||||
|
width: 1.5rem;
|
||||||
|
height: 100vh;
|
||||||
|
}
|
||||||
|
|
||||||
|
.bi {
|
||||||
|
vertical-align: -.125em;
|
||||||
|
fill: currentColor;
|
||||||
|
}
|
||||||
|
|
||||||
|
.nav-scroller {
|
||||||
|
position: relative;
|
||||||
|
z-index: 2;
|
||||||
|
height: 2.75rem;
|
||||||
|
overflow-y: hidden;
|
||||||
|
}
|
||||||
|
|
||||||
|
.nav-scroller .nav {
|
||||||
|
display: flex;
|
||||||
|
flex-wrap: nowrap;
|
||||||
|
padding-bottom: 1rem;
|
||||||
|
margin-top: -1px;
|
||||||
|
overflow-x: auto;
|
||||||
|
text-align: center;
|
||||||
|
white-space: nowrap;
|
||||||
|
-webkit-overflow-scrolling: touch;
|
||||||
|
}
|
||||||
|
|
||||||
|
.btn-bd-primary {
|
||||||
|
--bd-violet-bg: #712cf9;
|
||||||
|
--bd-violet-rgb: 112.520718, 44.062154, 249.437846;
|
||||||
|
|
||||||
|
--bs-btn-font-weight: 600;
|
||||||
|
--bs-btn-color: var(--bs-white);
|
||||||
|
--bs-btn-bg: var(--bd-violet-bg);
|
||||||
|
--bs-btn-border-color: var(--bd-violet-bg);
|
||||||
|
--bs-btn-hover-color: var(--bs-white);
|
||||||
|
--bs-btn-hover-bg: #6528e0;
|
||||||
|
--bs-btn-hover-border-color: #6528e0;
|
||||||
|
--bs-btn-focus-shadow-rgb: var(--bd-violet-rgb);
|
||||||
|
--bs-btn-active-color: var(--bs-btn-hover-color);
|
||||||
|
--bs-btn-active-bg: #5a23c8;
|
||||||
|
--bs-btn-active-border-color: #5a23c8;
|
||||||
|
}
|
||||||
|
|
||||||
|
.bd-mode-toggle {
|
||||||
|
z-index: 1500;
|
||||||
|
}
|
||||||
|
|
||||||
|
.bd-mode-toggle .dropdown-menu .active .bi {
|
||||||
|
display: block !important;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
</th:block>
|
46
src/main/resources/templates/login.html
Normal file
46
src/main/resources/templates/login.html
Normal file
@ -0,0 +1,46 @@
|
|||||||
|
<!DOCTYPE HTML>
|
||||||
|
<html xmlns:th="http://www.thymeleaf.org">
|
||||||
|
<head>
|
||||||
|
<th:block th:insert="~{fragments/header}"></th:block>
|
||||||
|
<link rel="stylesheet" href="/static/css/util.css">
|
||||||
|
<link href="/static/css/sign-in.css" rel="stylesheet">
|
||||||
|
</head>
|
||||||
|
<body class="d-flex align-items-center py-4 bg-body-tertiary">
|
||||||
|
<div th:replace="~{fragments/floating_button}"></div>
|
||||||
|
|
||||||
|
<main class="form-signin w-100 m-auto">
|
||||||
|
<div th:if="${param.error}">
|
||||||
|
<div class="alert alert-danger" role="alert" th:text="#{login_error}">
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div th:if="${error}">
|
||||||
|
<div class="alert alert-danger" role="alert" th:text="#{login_error}">
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<form method="post" th:action="@{/login}">
|
||||||
|
<h1 class="h3 mb-3 fw-normal" th:text="#{signin}"></h1>
|
||||||
|
|
||||||
|
<div class="form-floating">
|
||||||
|
<input type="text" name="username" class="form-control" id="floatingInput" placeholder="Username">
|
||||||
|
<label for="floatingInput" th:text="#{nname}"></label>
|
||||||
|
</div>
|
||||||
|
<div class="form-floating">
|
||||||
|
<input type="password" name="password" class="form-control" id="floatingPassword" placeholder="Password">
|
||||||
|
<label for="floatingPassword" th:text="#{pass}"></label>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="form-check text-start my-3">
|
||||||
|
<input class="form-check-input" type="checkbox" value="remember-me" id="flexCheckDefault">
|
||||||
|
<label class="form-check-label" for="flexCheckDefault" th:text="#{remember}"></label>
|
||||||
|
</div>
|
||||||
|
<button class="btn btn-primary w-100 py-2" type="submit" th:text="#{signin}"></button>
|
||||||
|
|
||||||
|
<p class="mt-3"><a th:href="@{/signup}" class="link-primary" th:text="#{signup}"></a></p>
|
||||||
|
|
||||||
|
<p class="mb-3 text-body-secondary">© alterdekim 2023</p>
|
||||||
|
</form>
|
||||||
|
</main>
|
||||||
|
<div th:replace="~{fragments/footer :: div}"></div>
|
||||||
|
</body>
|
||||||
|
</html>
|
309
src/main/resources/templates/panel.html
Normal file
309
src/main/resources/templates/panel.html
Normal file
@ -0,0 +1,309 @@
|
|||||||
|
<!DOCTYPE HTML>
|
||||||
|
<html xmlns="http://www.w3.org/1999/xhtml" xmlns:th="http://www.thymeleaf.org" xmlns:sec="https://www.thymeleaf.org/thymeleaf-extras-springsecurity6">
|
||||||
|
<head>
|
||||||
|
<th:block th:insert="~{fragments/header}"></th:block>
|
||||||
|
<link rel="stylesheet" href="/static/css/util.css">
|
||||||
|
<link rel="stylesheet" href="/static/css/panel.css">
|
||||||
|
</head>
|
||||||
|
<body class="bg-body-tertiary">
|
||||||
|
<div th:replace="~{fragments/floating_button}"></div>
|
||||||
|
<main>
|
||||||
|
<nav class="navbar navbar-expand-lg navbar-dark bg-dark" aria-label="Navbar">
|
||||||
|
<div class="container-fluid">
|
||||||
|
<a class="navbar-brand" href="#">[[${title} ? ${title} : 'Bunker']]</a>
|
||||||
|
<button class="navbar-toggler" type="button" data-bs-toggle="offcanvas" data-bs-target="#offcanvasNavbar2" aria-controls="offcanvasNavbar2">
|
||||||
|
<span class="navbar-toggler-icon"></span>
|
||||||
|
</button>
|
||||||
|
<div class="offcanvas offcanvas-end text-bg-dark" tabindex="-1" id="offcanvasNavbar2" aria-labelledby="offcanvasNavbar2Label">
|
||||||
|
<div class="offcanvas-header">
|
||||||
|
<h5 class="offcanvas-title" id="offcanvasNavbar2Label">[[${title} ? ${title} : 'Bunker']]</h5>
|
||||||
|
<button type="button" class="btn-close btn-close-white" data-bs-dismiss="offcanvas" aria-label="Close"></button>
|
||||||
|
</div>
|
||||||
|
<div class="offcanvas-body">
|
||||||
|
<ul class="navbar-nav justify-content-start flex-grow-1 pe-3">
|
||||||
|
<li class="nav-item">
|
||||||
|
</li>
|
||||||
|
<li class="nav-item dropdown">
|
||||||
|
<a class="nav-link dropdown-toggle" href="#" th:text="#{pplay}" role="button" data-bs-toggle="dropdown" aria-expanded="false">
|
||||||
|
|
||||||
|
</a>
|
||||||
|
<ul class="dropdown-menu">
|
||||||
|
<li><a class="dropdown-item" th:text="#{lugg}" href="/panel?section=lugg"></a></li>
|
||||||
|
<li><a class="dropdown-item" th:text="#{heeal}" href="/panel?section=heal"></a></li>
|
||||||
|
<li><a class="dropdown-item" th:text="#{pprof}" href="/panel?section=prof"></a></li>
|
||||||
|
<li><a class="dropdown-item" th:text="#{hhobb}" href="/panel?section=hobb"></a></li>
|
||||||
|
<li><a class="dropdown-item" th:text="#{aggend}" href="/panel?section=agge"></a></li>
|
||||||
|
</ul>
|
||||||
|
</li>
|
||||||
|
<li class="nav-item">
|
||||||
|
<a class="nav-link" href="/panel?section=diss" th:text="#{diss}"></a>
|
||||||
|
</li>
|
||||||
|
<li class="nav-item">
|
||||||
|
<a class="nav-link" href="/panel?section=stats" th:text="#{stats}"></a>
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
<ul class="navbar-nav justify-content-end flex-grow-1 pe-3">
|
||||||
|
<li class="nav-item dropdown">
|
||||||
|
<a class="nav-link dropdown-toggle" href="#" role="button" data-bs-toggle="dropdown" aria-expanded="false">
|
||||||
|
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="currentColor" class="bi bi-globe-americas" viewBox="0 0 16 16">
|
||||||
|
<path d="M8 0a8 8 0 1 0 0 16A8 8 0 0 0 8 0ZM2.04 4.326c.325 1.329 2.532 2.54 3.717 3.19.48.263.793.434.743.484-.08.08-.162.158-.242.234-.416.396-.787.749-.758 1.266.035.634.618.824 1.214 1.017.577.188 1.168.38 1.286.983.082.417-.075.988-.22 1.52-.215.782-.406 1.48.22 1.48 1.5-.5 3.798-3.186 4-5 .138-1.243-2-2-3.5-2.5-.478-.16-.755.081-.99.284-.172.15-.322.279-.51.216-.445-.148-2.5-2-1.5-2.5.78-.39.952-.171 1.227.182.078.099.163.208.273.318.609.304.662-.132.723-.633.039-.322.081-.671.277-.867.434-.434 1.265-.791 2.028-1.12.712-.306 1.365-.587 1.579-.88A7 7 0 1 1 2.04 4.327Z"></path>
|
||||||
|
</svg>
|
||||||
|
[[#{langl}]]
|
||||||
|
</a>
|
||||||
|
<ul class="dropdown-menu">
|
||||||
|
<li><a class="dropdown-item" href="/?lang=en" th:text="#{elang}"></a></li>
|
||||||
|
<li><a class="dropdown-item" href="/?lang=ru" th:text="#{rlang}"></a></li>
|
||||||
|
</ul>
|
||||||
|
</li>
|
||||||
|
<li class="nav-item">
|
||||||
|
<a class="nav-link" th:href="@{/logout}" th:text="#{logote}"></a>
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</nav>
|
||||||
|
<th:block th:if="${is_mobile}">
|
||||||
|
<div class="d-flex justify-content-center text-center">
|
||||||
|
<div class="row h-50">
|
||||||
|
<div class="card mt-2">
|
||||||
|
<div class="card-body">
|
||||||
|
<button type="button" data-bs-toggle="modal" onclick="add_entry_modal()" data-bs-target="#modal" class="btn btn-success" th:text="#{adddbtn}"></button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<th:block th:each="cc: ${cards}">
|
||||||
|
<div class="card mt-2">
|
||||||
|
<div class="card-body">
|
||||||
|
<h5 class="card-title" th:text="${cc.title}"></h5>
|
||||||
|
<p class="card-text">
|
||||||
|
<ul th:each="ll: ${cc.body}">
|
||||||
|
<li th:text="${ll}"></li>
|
||||||
|
</ul>
|
||||||
|
</p>
|
||||||
|
<a href="#" th:data-id="${cc.id}" data-bs-toggle="modal" data-bs-target="#modal_syn" onclick="" class="btn btn-primary" th:text="#{eddittsynn}"></a>
|
||||||
|
<a href="#" th:data-id="${cc.id}" data-bs-toggle="modal" data-bs-target="#modal" onclick="edit_entry(this)" class="btn btn-primary" th:text="#{edditbtn}"></a>
|
||||||
|
<a href="#" th:data-id="${cc.id}" onclick="remove_entry(this)" class="btn btn-danger" th:text="#{remombtn}"></a>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</th:block>
|
||||||
|
<th:block th:if="${section == 'stats'}">
|
||||||
|
<p>stats!!!!</p>
|
||||||
|
</th:block>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</th:block>
|
||||||
|
<th:block th:unless="${is_mobile}">
|
||||||
|
<div class="d-flex justify-content-start text-center">
|
||||||
|
<div class="col">
|
||||||
|
<div class="card mt-2">
|
||||||
|
<div class="card-body">
|
||||||
|
<button type="button" data-bs-toggle="modal" onclick="add_entry_modal()" data-bs-target="#modal" class="btn btn-success" th:text="#{adddbtn}"></button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<th:block th:each="cc: ${cards}">
|
||||||
|
<div class="col">
|
||||||
|
<div class="card mt-2">
|
||||||
|
<div class="card-body">
|
||||||
|
<h5 class="card-title" th:text="${cc.title}"></h5>
|
||||||
|
<p class="card-text">
|
||||||
|
<ul th:each="ll: ${cc.body}">
|
||||||
|
<li th:text="${ll}"></li>
|
||||||
|
</ul>
|
||||||
|
</p>
|
||||||
|
<a href="#" th:data-id="${cc.id}" data-bs-toggle="modal" data-bs-target="#modal_syn" onclick="show_synergies_modal(this)" class="btn btn-primary" th:text="#{eddittsynn}"></a>
|
||||||
|
<a href="#" th:data-id="${cc.id}" data-bs-toggle="modal" data-bs-target="#modal" onclick="edit_entry(this)" class="btn btn-primary" th:text="#{edditbtn}"></a>
|
||||||
|
<a href="#" th:data-id="${cc.id}" onclick="remove_entry(this)" class="btn btn-danger" th:text="#{remombtn}"></a>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</th:block>
|
||||||
|
</div>
|
||||||
|
</th:block>
|
||||||
|
<div class="modal fade" id="modal_syn" tabindex="-1" aria-labelledby="ModalLabelSyn" aria-hidden="true">
|
||||||
|
<div class="modal-dialog">
|
||||||
|
<div class="modal-content">
|
||||||
|
<div class="modal-header">
|
||||||
|
<h1 class="modal-title fs-5" id="ModalLabelSyn" th:text="#{aedentry}"></h1>
|
||||||
|
</div>
|
||||||
|
<div class="modal-body">
|
||||||
|
<form id="synergyForm">
|
||||||
|
<table class="table">
|
||||||
|
<thead>
|
||||||
|
<tr>
|
||||||
|
<th th:text="#{firentname}"></th>
|
||||||
|
<th th:text="#{firenttype}"></th>
|
||||||
|
<th th:text="#{secentname}"></th>
|
||||||
|
<th th:text="#{secenttype}"></th>
|
||||||
|
<th th:text="#{probbval}"></th>
|
||||||
|
<th th:text="#{actionbtn}"></th>
|
||||||
|
</tr>
|
||||||
|
</thead>
|
||||||
|
<tbody id="table_body_modal">
|
||||||
|
<tr>
|
||||||
|
<td>-</td>
|
||||||
|
<td>-</td>
|
||||||
|
<td><select id="second_select_vals"></select></td>
|
||||||
|
<td><select id="second_select_types" name="second_types" onchange="secondTypeChange(this)"><option value="lugg" th:text="#{lugg}"></option><option value="heal" th:text="#{heeal}"></option><option value="hobb" th:text="#{hhobb}"></option><option value="agge" th:text="#{aggend}">Gender</option><option value="prof" th:text="#{pprof}">Profession</option></select></td>
|
||||||
|
<td><input id="synergy_prob_input" type="number" value="0.0" min="-1" max="1" step="0.1"/></td>
|
||||||
|
<td><button type="button" data-id="0" id="add_synergy_button" class="btn btn-primary" onclick="add_synergy(this)" th:text="#{adddbtn}"></button></td>
|
||||||
|
</tr>
|
||||||
|
</tbody>
|
||||||
|
</table>
|
||||||
|
</form>
|
||||||
|
</div>
|
||||||
|
<div class="modal-footer">
|
||||||
|
<button type="button" class="btn btn-secondary" data-bs-toggle="modal" data-bs-dismiss="modal" th:text="#{cancbt}"></button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="modal fade" id="modal" tabindex="-1" data-bs-backdrop="static" aria-labelledby="ModalLabel" aria-hidden="true">
|
||||||
|
<div class="modal-dialog">
|
||||||
|
<div class="modal-content">
|
||||||
|
<div class="modal-header">
|
||||||
|
<h1 class="modal-title fs-5" id="ModalLabel" th:text="#{aedentry}"></h1>
|
||||||
|
</div>
|
||||||
|
<div class="modal-body">
|
||||||
|
<form id="entryForm">
|
||||||
|
<th:block th:switch="${section}">
|
||||||
|
<th:block th:case="agge">
|
||||||
|
<div class="mb-3">
|
||||||
|
<label class="form-check-label" th:text="#{inlcandie}" for="canDie"></label>
|
||||||
|
<input class="form-check-input" type="checkbox" value="" id="canDie" name="canDie" checked>
|
||||||
|
</div>
|
||||||
|
<div class="mb-3">
|
||||||
|
<label class="form-check-label" for="ismale" th:text="#{inlismal}"></label>
|
||||||
|
<input class="form-check-input" type="checkbox" value="" id="ismale" name="ismale">
|
||||||
|
</div>
|
||||||
|
<div class="mb-3">
|
||||||
|
<label class="form-check-label" for="isfemale" th:text="#{inlisfem}"></label>
|
||||||
|
<input class="form-check-input" type="checkbox" value="" id="isfemale" name="isfemale" checked>
|
||||||
|
</div>
|
||||||
|
<div class="mb-3">
|
||||||
|
<label for="gender_text" class="col-form-label" th:text="#{inlgente}"></label>
|
||||||
|
<input type="text" class="form-control" id="gender_text" name="gender_text">
|
||||||
|
</div>
|
||||||
|
</th:block>
|
||||||
|
<th:block th:case="hobb">
|
||||||
|
<div class="mb-3">
|
||||||
|
<label for="foodRange" class="form-label" th:text="#{inlfood}"></label>
|
||||||
|
<input type="range" class="form-range" id="foodRange" min="0" max="1" step="0.1" name="foodRange">
|
||||||
|
</div>
|
||||||
|
<div class="mb-3">
|
||||||
|
<label for="healRange" class="form-label" th:text="#{inlheal}"></label>
|
||||||
|
<input type="range" class="form-range" id="healRange" min="0" max="1" step="0.1" name="healRange">
|
||||||
|
</div>
|
||||||
|
<div class="mb-3">
|
||||||
|
<label for="powerRange" class="form-label" th:text="#{inlpower}"></label>
|
||||||
|
<input type="range" class="form-range" id="powerRange" min="0" max="1" step="0.1" name="powerRange">
|
||||||
|
</div>
|
||||||
|
<div class="mb-3">
|
||||||
|
<label for="violenceRange" class="form-label" th:text="#{inlviol}"></label>
|
||||||
|
<input type="range" class="form-range" id="violenceRange" min="0" max="1" step="0.1" name="violenceRange">
|
||||||
|
</div>
|
||||||
|
<div class="mb-3">
|
||||||
|
<label for="hobby_text" class="col-form-label" th:text="#{hobblab}"></label>
|
||||||
|
<input type="text" class="form-control" id="hobby_text" name="hobby_text">
|
||||||
|
</div>
|
||||||
|
</th:block>
|
||||||
|
<th:block th:case="lugg">
|
||||||
|
<div class="mb-3">
|
||||||
|
<label for="foodRange" class="form-label" th:text="#{inlfood}"></label>
|
||||||
|
<input type="range" class="form-range" id="foodRange" min="0" max="1" step="0.1" name="foodRange">
|
||||||
|
</div>
|
||||||
|
<div class="mb-3">
|
||||||
|
<label for="healRange" class="form-label" th:text="#{inlheal}"></label>
|
||||||
|
<input type="range" class="form-range" id="healRange" min="0" max="1" step="0.1" name="healRange">
|
||||||
|
</div>
|
||||||
|
<div class="mb-3">
|
||||||
|
<label for="powerRange" class="form-label" th:text="#{inlpower}"></label>
|
||||||
|
<input type="range" class="form-range" id="powerRange" min="0" max="1" step="0.1" name="powerRange">
|
||||||
|
</div>
|
||||||
|
<div class="mb-3">
|
||||||
|
<label for="violenceRange" class="form-label" th:text="#{inlviol}"></label>
|
||||||
|
<input type="range" class="form-range" id="violenceRange" min="0" max="1" step="0.1" name="violenceRange">
|
||||||
|
</div>
|
||||||
|
<div class="mb-3">
|
||||||
|
<label class="form-check-label" for="isgarbage" th:text="#{inlgarb}"></label>
|
||||||
|
<input class="form-check-input" type="checkbox" value="" id="isgarbage" name="isgarbage">
|
||||||
|
</div>
|
||||||
|
<div class="mb-3">
|
||||||
|
<label for="luggage_name_text" class="col-form-label" th:text="#{inlaname}"></label>
|
||||||
|
<input type="text" class="form-control" id="luggage_name_text" name="luggage_name_text">
|
||||||
|
</div>
|
||||||
|
<div class="mb-3">
|
||||||
|
<label for="luggage_desc_text" class="col-form-label" th:text="#{inladesc}"></label>
|
||||||
|
<input type="text" class="form-control" id="luggage_desc_text" name="luggage_desc_text">
|
||||||
|
</div>
|
||||||
|
</th:block>
|
||||||
|
<th:block th:case="heal">
|
||||||
|
<div class="mb-3">
|
||||||
|
<label for="health_index" class="form-label" th:text="#{inlhin}"></label>
|
||||||
|
<input type="range" class="form-range" id="health_index" min="0" max="1" step="0.1" name="health_index">
|
||||||
|
</div>
|
||||||
|
<div class="mb-3">
|
||||||
|
<label class="form-check-label" for="childFree" th:text="#{inlcfr}"></label>
|
||||||
|
<input class="form-check-input" type="checkbox" value="" id="childFree" name="childFree">
|
||||||
|
</div>
|
||||||
|
<div class="mb-3">
|
||||||
|
<label for="heal_name_text" class="col-form-label" th:text="#{inlaname}"></label>
|
||||||
|
<input type="text" class="form-control" id="heal_name_text" name="heal_name_text">
|
||||||
|
</div>
|
||||||
|
<div class="mb-3">
|
||||||
|
<label for="heal_desc_text" class="col-form-label" th:text="#{inladesc}"></label>
|
||||||
|
<input type="text" class="form-control" id="heal_desc_text" name="heal_desc_text">
|
||||||
|
</div>
|
||||||
|
</th:block>
|
||||||
|
<th:block th:case="prof">
|
||||||
|
<div class="mb-3">
|
||||||
|
<label for="foodRange" class="form-label" th:text="#{inlfood}"></label>
|
||||||
|
<input type="range" class="form-range" id="foodRange" min="0" max="1" step="0.1" name="foodRange">
|
||||||
|
</div>
|
||||||
|
<div class="mb-3">
|
||||||
|
<label for="healRange" class="form-label" th:text="#{inlheal}"></label>
|
||||||
|
<input type="range" class="form-range" id="healRange" min="0" max="1" step="0.1" name="healRange">
|
||||||
|
</div>
|
||||||
|
<div class="mb-3">
|
||||||
|
<label for="powerRange" class="form-label" th:text="#{inlpower}"></label>
|
||||||
|
<input type="range" class="form-range" id="powerRange" min="0" max="1" step="0.1" name="powerRange">
|
||||||
|
</div>
|
||||||
|
<div class="mb-3">
|
||||||
|
<label for="violenceRange" class="form-label" th:text="#{inlviol}"></label>
|
||||||
|
<input type="range" class="form-range" id="violenceRange" min="0" max="1" step="0.1" name="violenceRange">
|
||||||
|
</div>
|
||||||
|
<div class="mb-3">
|
||||||
|
<label for="work_name_text" class="col-form-label" th:text="#{inlaname}"></label>
|
||||||
|
<input type="text" class="form-control" id="work_name_text" name="work_name_text">
|
||||||
|
</div>
|
||||||
|
<div class="mb-3">
|
||||||
|
<label for="work_desc_text" class="col-form-label" th:text="#{inladesc}"></label>
|
||||||
|
<input type="text" class="form-control" id="work_desc_text" name="work_desc_text">
|
||||||
|
</div>
|
||||||
|
</th:block>
|
||||||
|
<th:block th:case="diss">
|
||||||
|
<div class="mb-3">
|
||||||
|
<label for="diss_name_text" class="col-form-label" th:text="#{inlaname}"></label>
|
||||||
|
<input type="text" class="form-control" id="diss_name_text" name="diss_name_text">
|
||||||
|
</div>
|
||||||
|
<div class="mb-3">
|
||||||
|
<label for="diss_desc_text" class="col-form-label" th:text="#{inladesc}"></label>
|
||||||
|
<input type="text" class="form-control" id="diss_desc_text" name="diss_desc_text">
|
||||||
|
</div>
|
||||||
|
</th:block>
|
||||||
|
</th:block>
|
||||||
|
</form>
|
||||||
|
</div>
|
||||||
|
<div class="modal-footer">
|
||||||
|
<button type="button" class="btn btn-secondary" data-bs-dismiss="modal" th:text="#{cancbt}"></button>
|
||||||
|
<button type="button" id="modal_submit_add" onclick="add_entry()" class="btn btn-success" th:text="#{adddbtn}"></button>
|
||||||
|
<button type="button" data-entry-id="0" style="display: none;" id="modal_submit_edit" onclick="edit_submit_entry(this)" class="btn btn-primary" th:text="#{edditbtn}"></button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<script src="/static/javascript/panel-script.js" type="text/javascript"></script>
|
||||||
|
</main>
|
||||||
|
<div th:replace="~{fragments/footer :: div}"></div>
|
||||||
|
</body>
|
||||||
|
</html>
|
51
src/main/resources/templates/signup.html
Normal file
51
src/main/resources/templates/signup.html
Normal file
@ -0,0 +1,51 @@
|
|||||||
|
<!DOCTYPE HTML>
|
||||||
|
<html xmlns:th="http://www.thymeleaf.org">
|
||||||
|
<head>
|
||||||
|
<th:block th:insert="~{fragments/header}"></th:block>
|
||||||
|
<link rel="stylesheet" href="/static/css/util.css">
|
||||||
|
<link href="/static/css/sign-up.css" rel="stylesheet">
|
||||||
|
</head>
|
||||||
|
<body class="d-flex align-items-center py-4 bg-body-tertiary">
|
||||||
|
<div th:replace="~{fragments/floating_button}"></div>
|
||||||
|
|
||||||
|
<main class="form-signup w-100 m-auto">
|
||||||
|
<div th:if="${param.error}">
|
||||||
|
<div class="alert alert-danger" role="alert" th:text="#{incorcred}">
|
||||||
|
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div th:if="${error}">
|
||||||
|
<div class="alert alert-danger" role="alert" th:text="#{incorcred}">
|
||||||
|
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<form method="post" th:action="@{/signup}" th:object="${user}">
|
||||||
|
<h1 class="h3 mb-3 fw-normal" th:text="#{signup}"></h1>
|
||||||
|
|
||||||
|
<div class="form-floating">
|
||||||
|
<input type="text" name="username" class="form-control" id="floatingInput" placeholder="Username">
|
||||||
|
<label for="floatingInput" th:text="#{nname}"></label>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="form-floating mt-1">
|
||||||
|
<input type="password" name="password" class="form-control" id="floatingPassword" placeholder="Password">
|
||||||
|
<label for="floatingPassword" th:text="#{pass}"></label>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="form-floating mt-1">
|
||||||
|
<input type="text" name="invite_code" class="form-control" id="floatingInvite" placeholder="Invite code">
|
||||||
|
<label for="floatingInvite" th:text="#{invitecode}"></label>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<button class="btn btn-primary w-100 py-2 mt-3" type="submit" th:text="#{signup}"></button>
|
||||||
|
|
||||||
|
<p class="mt-3"><a th:href="@{/login}" class="link-primary" th:text="#{signin}"></a></p>
|
||||||
|
|
||||||
|
<p class="mb-3 text-body-secondary">© alterdekim 2023</p>
|
||||||
|
</form>
|
||||||
|
</main>
|
||||||
|
<div th:replace="~{fragments/footer :: div}"></div>
|
||||||
|
</body>
|
||||||
|
</html>
|
Loading…
x
Reference in New Issue
Block a user