mirror of
https://github.com/tiennm99/store-scraper-bot-java.git
synced 2026-05-21 06:24:26 +00:00
Refactor config to Environment and add Table utility
Replaces Config with Environment throughout the codebase for environment variable management. Introduces a Table utility class for formatting tabular data in bot commands, refactoring commands to use this for improved output formatting. Removes unused AppType enum. Updates test cases and build configuration for better IDE integration.
This commit is contained in:
@@ -1,6 +1,6 @@
|
||||
package com.miti99.storescraperbot.bot;
|
||||
|
||||
import com.miti99.storescraperbot.config.Config;
|
||||
import com.miti99.storescraperbot.env.Environment;
|
||||
import lombok.extern.log4j.Log4j2;
|
||||
import org.telegram.telegrambots.client.okhttp.OkHttpTelegramClient;
|
||||
import org.telegram.telegrambots.meta.api.methods.ParseMode;
|
||||
@@ -11,7 +11,7 @@ public class StoreScrapeBotTelegramClient extends OkHttpTelegramClient {
|
||||
public static final StoreScrapeBotTelegramClient INSTANCE = new StoreScrapeBotTelegramClient();
|
||||
|
||||
public StoreScrapeBotTelegramClient() {
|
||||
super(Config.TELEGRAM_BOT_TOKEN);
|
||||
super(Environment.TELEGRAM_BOT_TOKEN);
|
||||
}
|
||||
|
||||
public void sendMessage(long chatId, String text) {
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
package com.miti99.storescraperbot.bot;
|
||||
|
||||
import com.miti99.storescraperbot.config.Config;
|
||||
import com.miti99.storescraperbot.env.Environment;
|
||||
import java.util.function.Supplier;
|
||||
|
||||
public class StoreScrapeBotUsernameSupplier implements Supplier<String> {
|
||||
@@ -9,6 +9,6 @@ public class StoreScrapeBotUsernameSupplier implements Supplier<String> {
|
||||
|
||||
@Override
|
||||
public String get() {
|
||||
return Config.TELEGRAM_BOT_USERNAME;
|
||||
return Environment.TELEGRAM_BOT_USERNAME;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
package com.miti99.storescraperbot.bot.command;
|
||||
|
||||
import com.miti99.storescraperbot.bot.StoreScrapeBotTelegramClient;
|
||||
import com.miti99.storescraperbot.config.Config;
|
||||
import com.miti99.storescraperbot.env.Environment;
|
||||
import com.miti99.storescraperbot.repository.AdminRepository;
|
||||
import com.miti99.storescraperbot.repository.GroupRepository;
|
||||
import org.telegram.telegrambots.meta.api.objects.User;
|
||||
@@ -18,7 +18,7 @@ public class AddGroupCommand extends BaseStoreScraperBotCommand {
|
||||
@Override
|
||||
protected void executeCommand(
|
||||
TelegramClient telegramClient, User user, Chat chat, String[] arguments) {
|
||||
if (!Config.ADMIN_IDS.contains(user.getId())) {
|
||||
if (!Environment.ADMIN_IDS.contains(user.getId())) {
|
||||
StoreScrapeBotTelegramClient.INSTANCE.sendMessage(chat.getId(), "You are not admin");
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -3,6 +3,7 @@ package com.miti99.storescraperbot.bot.command;
|
||||
import com.miti99.storescraperbot.api.apple.AppStoreScraper;
|
||||
import com.miti99.storescraperbot.api.google.GooglePlayScraper;
|
||||
import com.miti99.storescraperbot.bot.StoreScrapeBotTelegramClient;
|
||||
import com.miti99.storescraperbot.bot.table.Table;
|
||||
import com.miti99.storescraperbot.constant.Constant;
|
||||
import com.miti99.storescraperbot.repository.AdminRepository;
|
||||
import com.miti99.storescraperbot.repository.GroupRepository;
|
||||
@@ -41,34 +42,31 @@ public class CheckAppCommand extends BaseStoreScraperBotCommand {
|
||||
var sb = new StringBuilder();
|
||||
sb.append("<b>Apple Apps:</b>\n");
|
||||
sb.append("<code>\n");
|
||||
sb.append("%-20s | %-10s | %-4s | %-2s\n".formatted("AppId", "Updated", "Days", "OK"));
|
||||
sb.append("-".repeat(46));
|
||||
sb.append("\n");
|
||||
var appleTable = new Table("AppId", "Updated", "Days", "OK");
|
||||
for (var app : group.getAppleApps()) {
|
||||
var appId = app.appId();
|
||||
var updated = AppStoreScraper.getAppUpdated(appId, app.country());
|
||||
long days = ChronoUnit.DAYS.between(updated, now);
|
||||
boolean passed = days <= Constant.NUM_DAYS_WARNING_NOT_UPDATED;
|
||||
sb.append(
|
||||
"%-20s | %-10s | %-4s | %-2s\n".formatted(appId, updated, days, passed ? "✅" : "❌"));
|
||||
var icon = passed ? "✅" : "❌";
|
||||
appleTable.addRow(appId, updated, days, icon);
|
||||
}
|
||||
sb.append(appleTable);
|
||||
sb.append("</code>\n");
|
||||
sb.append("\n");
|
||||
|
||||
sb.append("<b>Google Apps:</b>\n");
|
||||
sb.append("<code>\n");
|
||||
sb.append("%-20s | %-10s | %-4s | %-2s\n".formatted("AppId", "Updated", "Days", "OK"));
|
||||
sb.append("-".repeat(46));
|
||||
sb.append("\n");
|
||||
var googleTable = new Table("AppId", "Updated", "Days", "OK");
|
||||
for (var app : group.getGoogleApps()) {
|
||||
var appId = app.appId();
|
||||
var updated = GooglePlayScraper.getLastUpdateOfApp(appId, app.country());
|
||||
long days = ChronoUnit.DAYS.between(updated, now);
|
||||
boolean passed = days <= Constant.NUM_DAYS_WARNING_NOT_UPDATED;
|
||||
sb.append(
|
||||
"%-20s | %-10s | %-4s | %-2s\n".formatted(appId, updated, days, passed ? "✅" : "❌"));
|
||||
var icon = passed ? "✅" : "❌";
|
||||
googleTable.addRow(appId, updated, days, icon);
|
||||
}
|
||||
sb.append(googleTable);
|
||||
sb.append("</code>");
|
||||
sb.append("\n");
|
||||
|
||||
StoreScrapeBotTelegramClient.INSTANCE.sendMessage(chat.getId(), sb.toString());
|
||||
}
|
||||
|
||||
@@ -3,6 +3,7 @@ package com.miti99.storescraperbot.bot.command;
|
||||
import com.miti99.storescraperbot.api.apple.AppStoreScraper;
|
||||
import com.miti99.storescraperbot.api.google.GooglePlayScraper;
|
||||
import com.miti99.storescraperbot.bot.StoreScrapeBotTelegramClient;
|
||||
import com.miti99.storescraperbot.bot.table.Table;
|
||||
import com.miti99.storescraperbot.repository.AdminRepository;
|
||||
import com.miti99.storescraperbot.repository.GroupRepository;
|
||||
import org.telegram.telegrambots.meta.api.objects.User;
|
||||
@@ -37,32 +38,29 @@ public class CheckAppScoreCommand extends BaseStoreScraperBotCommand {
|
||||
var sb = new StringBuilder();
|
||||
sb.append("<b>Apple Apps:</b>\n");
|
||||
sb.append("<code>\n");
|
||||
sb.append("%-20s | %-10s | %-10s\n".formatted("AppId", "Score", "Ratings"));
|
||||
sb.append("-".repeat(43));
|
||||
sb.append("\n");
|
||||
var appleTable = new Table("AppId", "Score", "Ratings");
|
||||
for (var app : group.getAppleApps()) {
|
||||
var appId = app.appId();
|
||||
var country = app.country();
|
||||
double score = AppStoreScraper.getAppScore(appId, country);
|
||||
long ratings = AppStoreScraper.getAppRatings(appId, country);
|
||||
sb.append("%-20s | %-10s | %-10s\n".formatted(appId, score, ratings));
|
||||
appleTable.addRow(appId, score, ratings);
|
||||
}
|
||||
sb.append(appleTable);
|
||||
sb.append("</code>\n");
|
||||
sb.append("\n");
|
||||
|
||||
sb.append("<b>Google Apps:</b>\n");
|
||||
sb.append("<code>\n");
|
||||
sb.append("%-20s | %-10s | %-10s\n".formatted("AppId", "Score", "Ratings"));
|
||||
sb.append("-".repeat(43));
|
||||
sb.append("\n");
|
||||
var googleTable = new Table("AppId", "Score", "Ratings");
|
||||
for (var app : group.getGoogleApps()) {
|
||||
var appId = app.appId();
|
||||
var country = app.country();
|
||||
double score = GooglePlayScraper.getAppScore(appId, country);
|
||||
long ratings = GooglePlayScraper.getAppRatings(appId, country);
|
||||
sb.append("%-20s | %-10s | %-10s\n".formatted(appId, score, ratings));
|
||||
googleTable.addRow(appId, score, ratings);
|
||||
}
|
||||
sb.append(googleTable);
|
||||
sb.append("</code>");
|
||||
sb.append("\n");
|
||||
|
||||
StoreScrapeBotTelegramClient.INSTANCE.sendMessage(chat.getId(), sb.toString());
|
||||
}
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
package com.miti99.storescraperbot.bot.command;
|
||||
|
||||
import com.miti99.storescraperbot.bot.StoreScrapeBotTelegramClient;
|
||||
import com.miti99.storescraperbot.config.Config;
|
||||
import com.miti99.storescraperbot.env.Environment;
|
||||
import com.miti99.storescraperbot.repository.AdminRepository;
|
||||
import org.telegram.telegrambots.meta.api.objects.User;
|
||||
import org.telegram.telegrambots.meta.api.objects.chat.Chat;
|
||||
@@ -17,7 +17,7 @@ public class DeleteGroupCommand extends BaseStoreScraperBotCommand {
|
||||
@Override
|
||||
protected void executeCommand(
|
||||
TelegramClient telegramClient, User user, Chat chat, String[] arguments) {
|
||||
if (!Config.ADMIN_IDS.contains(user.getId())) {
|
||||
if (!Environment.ADMIN_IDS.contains(user.getId())) {
|
||||
StoreScrapeBotTelegramClient.INSTANCE.sendMessage(chat.getId(), "You are not admin");
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
package com.miti99.storescraperbot.bot.command;
|
||||
|
||||
import com.miti99.storescraperbot.bot.StoreScrapeBotTelegramClient;
|
||||
import com.miti99.storescraperbot.bot.table.Table;
|
||||
import com.miti99.storescraperbot.repository.AdminRepository;
|
||||
import com.miti99.storescraperbot.repository.GroupRepository;
|
||||
import org.telegram.telegrambots.meta.api.objects.User;
|
||||
@@ -35,29 +36,25 @@ public class ListAppCommand extends BaseStoreScraperBotCommand {
|
||||
var sb = new StringBuilder();
|
||||
sb.append("<b>Apple Apps:</b>\n");
|
||||
sb.append("<code>\n");
|
||||
sb.append("%-2s | %-20s | %-7s\n".formatted("#", "AppId", "Country"));
|
||||
sb.append("-".repeat(25));
|
||||
sb.append("\n");
|
||||
var appleTable = new Table("#", "AppId", "Country");
|
||||
int i = 0;
|
||||
for (var app : group.getAppleApps()) {
|
||||
i++;
|
||||
sb.append("%-2s | %-20s | %-7s\n".formatted(i, app.appId(), app.country()));
|
||||
appleTable.addRow(i, app.appId(), app.country());
|
||||
}
|
||||
sb.append(appleTable);
|
||||
sb.append("</code>\n");
|
||||
sb.append("\n");
|
||||
|
||||
sb.append("\n<b>Google Apps:</b>\n");
|
||||
sb.append("<b>Google Apps:</b>\n");
|
||||
sb.append("<code>\n");
|
||||
sb.append("%-2s | %-20s | %-7s\n".formatted("#", "AppId", "Country"));
|
||||
sb.append("-".repeat(35));
|
||||
sb.append("\n");
|
||||
var googleTable = new Table("#", "AppId", "Country");
|
||||
i = 0;
|
||||
for (var app : group.getGoogleApps()) {
|
||||
i++;
|
||||
sb.append("%-2s | %-20s | %-7s\n".formatted(i, app.appId(), app.country()));
|
||||
googleTable.addRow(i, app.appId(), app.country());
|
||||
}
|
||||
sb.append("</code>\n");
|
||||
sb.append("\n");
|
||||
sb.append(googleTable);
|
||||
sb.append("</code>");
|
||||
|
||||
StoreScrapeBotTelegramClient.INSTANCE.sendMessage(chat.getId(), sb.toString());
|
||||
}
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
package com.miti99.storescraperbot.bot.command;
|
||||
|
||||
import com.miti99.storescraperbot.bot.StoreScrapeBotTelegramClient;
|
||||
import com.miti99.storescraperbot.config.Config;
|
||||
import com.miti99.storescraperbot.env.Environment;
|
||||
import com.miti99.storescraperbot.repository.AdminRepository;
|
||||
import org.telegram.telegrambots.meta.api.objects.User;
|
||||
import org.telegram.telegrambots.meta.api.objects.chat.Chat;
|
||||
@@ -17,7 +17,7 @@ public class ListGroupCommand extends BaseStoreScraperBotCommand {
|
||||
@Override
|
||||
protected void executeCommand(
|
||||
TelegramClient telegramClient, User user, Chat chat, String[] arguments) {
|
||||
if (!Config.ADMIN_IDS.contains(user.getId())) {
|
||||
if (!Environment.ADMIN_IDS.contains(user.getId())) {
|
||||
StoreScrapeBotTelegramClient.INSTANCE.sendMessage(chat.getId(), "You are not admin");
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -0,0 +1,53 @@
|
||||
package com.miti99.storescraperbot.bot.table;
|
||||
|
||||
import java.util.Arrays;
|
||||
import java.util.List;
|
||||
import java.util.stream.Collectors;
|
||||
import kotlin.collections.ArrayDeque;
|
||||
|
||||
public class Table {
|
||||
private final String[] headers;
|
||||
private final List<String[]> rows = new ArrayDeque<>();
|
||||
|
||||
public Table(String... headers) {
|
||||
this.headers = headers;
|
||||
}
|
||||
|
||||
public void addRow(Object... objs) {
|
||||
if (objs.length != headers.length) {
|
||||
throw new IllegalArgumentException(
|
||||
"objs.length (%d) != headers.length (%d)".formatted(objs.length, headers.length));
|
||||
}
|
||||
var row = new String[objs.length];
|
||||
for (int i = 0; i < objs.length; i++) {
|
||||
row[i] = String.valueOf(objs[i]);
|
||||
}
|
||||
rows.add(row);
|
||||
}
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
int[] maxWidths = new int[headers.length];
|
||||
for (int i = 0; i < headers.length; i++) {
|
||||
maxWidths[i] = headers[i].length();
|
||||
}
|
||||
for (var row : rows) {
|
||||
for (int i = 0; i < row.length; i++) {
|
||||
maxWidths[i] = Math.max(maxWidths[i], row[i].length());
|
||||
}
|
||||
}
|
||||
var formater =
|
||||
Arrays.stream(maxWidths)
|
||||
.mapToObj(width -> "%-" + width + "s")
|
||||
.collect(Collectors.joining(" │ ", "", "\n"));
|
||||
var sb = new StringBuilder();
|
||||
sb.append(formater.formatted((Object[]) headers));
|
||||
var rule =
|
||||
Arrays.stream(maxWidths).mapToObj("─"::repeat).collect(Collectors.joining("─┼─", "", "\n"));
|
||||
sb.append(rule);
|
||||
for (var row : rows) {
|
||||
sb.append(formater.formatted((Object[]) row));
|
||||
}
|
||||
return sb.toString();
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user