Skip to content

Commit 720ec32

Browse files
Добавлены модули для настройки зависимостей с использованием Guice; рефакторинг класса Main для инициализации через Bootstrap
1 parent 92ae4fd commit 720ec32

24 files changed

+343
-67
lines changed

pom.xml

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -90,6 +90,12 @@
9090
<artifactId>jaxb-api</artifactId>
9191
<version>2.3.1</version>
9292
</dependency>
93+
<dependency>
94+
<groupId>com.google.inject</groupId>
95+
<artifactId>guice</artifactId>
96+
<version>7.0.0</version>
97+
</dependency>
98+
9399
<dependency>
94100
<groupId>junit</groupId>
95101
<artifactId>junit</artifactId>
Lines changed: 81 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,81 @@
1+
package ru.untitled_devs.bot;
2+
3+
import com.google.inject.Inject;
4+
import org.slf4j.Logger;
5+
import org.telegram.telegrambots.meta.TelegramBotsApi;
6+
import ru.untitled_devs.bot.features.localisation.LocalisationMiddleware;
7+
import ru.untitled_devs.bot.features.localisation.LocalisationScene;
8+
import ru.untitled_devs.bot.features.menu.MainMenuScene;
9+
import ru.untitled_devs.bot.features.prfile.ProfileScene;
10+
import ru.untitled_devs.bot.features.registration.LoginMiddleware;
11+
import ru.untitled_devs.bot.features.registration.RegistrationScene;
12+
import ru.untitled_devs.bot.features.start.StartMiddleware;
13+
import ru.untitled_devs.core.client.PollingClient;
14+
import ru.untitled_devs.core.dispatcher.Dispatcher;
15+
import ru.untitled_devs.core.routers.scenes.SceneManager;
16+
17+
public class Bootstrap {
18+
private final Logger logger;
19+
private final TelegramBotsApi botsApi;
20+
private final PollingClient bot;
21+
private final Dispatcher dispatcher;
22+
private final SceneManager scenes;
23+
24+
private final RegistrationScene registrationScene;
25+
private final LocalisationScene localisationScene;
26+
private final MainMenuScene mainMenuScene;
27+
private final ProfileScene profileScene;
28+
29+
private final LocalisationMiddleware localisationMiddleware;
30+
private final LoginMiddleware loginMiddleware;
31+
private final StartMiddleware startMiddleware;
32+
33+
@Inject
34+
public Bootstrap(
35+
Logger logger,
36+
TelegramBotsApi botsApi,
37+
PollingClient bot,
38+
Dispatcher dispatcher,
39+
SceneManager scenes,
40+
RegistrationScene registrationScene,
41+
LocalisationScene localisationScene,
42+
MainMenuScene mainMenuScene,
43+
ProfileScene profileScene,
44+
LocalisationMiddleware localisationMiddleware,
45+
LoginMiddleware loginMiddleware,
46+
StartMiddleware startMiddleware
47+
) {
48+
this.logger = logger;
49+
this.botsApi = botsApi;
50+
this.bot = bot;
51+
this.dispatcher = dispatcher;
52+
this.scenes = scenes;
53+
this.registrationScene = registrationScene;
54+
this.localisationScene = localisationScene;
55+
this.mainMenuScene = mainMenuScene;
56+
this.profileScene = profileScene;
57+
this.localisationMiddleware = localisationMiddleware;
58+
this.loginMiddleware = loginMiddleware;
59+
this.startMiddleware = startMiddleware;
60+
}
61+
62+
public void start() {
63+
try {
64+
scenes.register("register", registrationScene);
65+
scenes.register("lang", localisationScene);
66+
scenes.register("menu", mainMenuScene);
67+
scenes.register("profile", profileScene);
68+
69+
dispatcher.addMiddleware(localisationMiddleware);
70+
dispatcher.addMiddleware(loginMiddleware);
71+
dispatcher.addMiddleware(startMiddleware);
72+
73+
botsApi.registerBot(bot);
74+
75+
logger.info("Bot up.");
76+
} catch (Exception e) {
77+
logger.error("Boot error: {}", e.getMessage(), e);
78+
throw new RuntimeException(e);
79+
}
80+
}
81+
}
Lines changed: 6 additions & 67 deletions
Original file line numberDiff line numberDiff line change
@@ -1,73 +1,12 @@
11
package ru.untitled_devs.bot;
22

3-
import com.mongodb.client.MongoClient;
4-
import com.mongodb.client.MongoClients;
5-
import dev.morphia.Datastore;
6-
import dev.morphia.Morphia;
7-
import org.slf4j.Logger;
8-
import org.slf4j.LoggerFactory;
9-
import org.telegram.telegrambots.meta.TelegramBotsApi;
10-
import org.telegram.telegrambots.updatesreceivers.DefaultBotSession;
11-
import ru.untitled_devs.bot.config.Config;
12-
import ru.untitled_devs.bot.features.localisation.LocalisationMiddleware;
13-
import ru.untitled_devs.bot.features.localisation.LocalisationScene;
14-
import ru.untitled_devs.bot.features.menu.MainMenuScene;
15-
import ru.untitled_devs.bot.features.registration.LoginMiddleware;
16-
import ru.untitled_devs.bot.features.registration.RegistrationScene;
17-
import ru.untitled_devs.bot.features.registration.RegistrationService;
18-
import ru.untitled_devs.bot.features.start.StartMiddleware;
19-
import ru.untitled_devs.bot.shared.geocoder.Geocoder;
20-
import ru.untitled_devs.bot.shared.geocoder.yandex.YandexGeocoder;
21-
import ru.untitled_devs.bot.shared.image.ImageService;
22-
import ru.untitled_devs.core.client.PollingClient;
23-
import ru.untitled_devs.core.dispatcher.Dispatcher;
24-
import ru.untitled_devs.core.fsm.storage.InMemoryStorage;
25-
import ru.untitled_devs.core.routers.scenes.SceneManager;
26-
import software.amazon.awssdk.auth.credentials.AwsBasicCredentials;
27-
import software.amazon.awssdk.auth.credentials.AwsCredentials;
28-
import software.amazon.awssdk.regions.Region;
29-
30-
import java.net.URI;
3+
import com.google.inject.Guice;
4+
import com.google.inject.Injector;
5+
import ru.untitled_devs.bot.di.AppModule;
316

327
public class Main {
338
public static void main(String[] args) {
34-
InMemoryStorage storage = new InMemoryStorage();
35-
SceneManager sceneManager = new SceneManager();
36-
Logger logger = LoggerFactory.getLogger(Main.class);
37-
Dispatcher dispatcher = new Dispatcher(storage, sceneManager);
38-
MongoClient client = MongoClients.create(Config.getMongoConfig().getMongoString());
39-
Datastore datastore = Morphia.createDatastore(client, Config.getMongoConfig().getMongoDBName());
40-
41-
Geocoder geocoder =
42-
new YandexGeocoder(Config.getGeocodingConfig().getApiUrl(),
43-
Config.getGeocodingConfig().getApiKey());
44-
45-
RegistrationService regService = new RegistrationService(datastore);
46-
47-
URI endpoint = URI.create(Config.getS3Config().getEndpoint());
48-
String accessKey = Config.getS3Config().getAccessKey();
49-
String secretKey = Config.getS3Config().getSecretKey();
50-
String bucketName = Config.getS3Config().getBucketName();
51-
AwsCredentials credentials = AwsBasicCredentials.create(accessKey, secretKey);
52-
Region region = Region.US_EAST_1;
53-
ImageService imageService = new ImageService(endpoint, credentials, region, bucketName, datastore);
54-
55-
try {
56-
TelegramBotsApi botsApi = new TelegramBotsApi(DefaultBotSession.class);
57-
PollingClient bot = new PollingClient(Config.getBotConfig().getBotToken(),
58-
Config.getBotConfig().getBotName(), dispatcher);
59-
60-
sceneManager.register("register", new RegistrationScene(bot, regService, geocoder, imageService, sceneManager));
61-
sceneManager.register("lang", new LocalisationScene(bot));
62-
sceneManager.register("menu", new MainMenuScene(bot, sceneManager));
63-
64-
dispatcher.addMiddleware(new LocalisationMiddleware(sceneManager));
65-
dispatcher.addMiddleware(new LoginMiddleware(sceneManager, regService));
66-
dispatcher.addMiddleware(new StartMiddleware(sceneManager));
67-
68-
botsApi.registerBot(bot);
69-
} catch (Exception e) {
70-
logger.error(e.getMessage());
71-
}
72-
}
9+
Injector injector = Guice.createInjector(new AppModule());
10+
injector.getInstance(Bootstrap.class).start();
11+
}
7312
}
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
package ru.untitled_devs.bot.di;
2+
3+
import com.google.inject.AbstractModule;
4+
5+
public class AppModule extends AbstractModule {
6+
@Override protected void configure() {
7+
install(new ConfigModule());
8+
install(new CoreModule());
9+
install(new MongoModule());
10+
install(new SharedModule());
11+
install(new FeaturesModule());
12+
install(new TelegramModule());
13+
}
14+
}
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
package ru.untitled_devs.bot.di;
2+
3+
import com.google.inject.AbstractModule;
4+
import com.google.inject.Provides;
5+
import com.google.inject.Singleton;
6+
import ru.untitled_devs.bot.config.*;
7+
8+
public class ConfigModule extends AbstractModule {
9+
@Override
10+
protected void configure() {
11+
12+
}
13+
14+
@Provides @Singleton BotConfig botConfig() { return new BotConfig(); }
15+
@Provides @Singleton MongoConfig mongoConfig() { return new MongoConfig(); }
16+
@Provides @Singleton GeocodingConfig geocodingConfig() { return new GeocodingConfig(); }
17+
@Provides @Singleton S3Config s3Config() { return new S3Config(); }
18+
}
Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
package ru.untitled_devs.bot.di;
2+
3+
import com.google.inject.AbstractModule;
4+
import com.google.inject.Provides;
5+
import com.google.inject.Singleton;
6+
import org.slf4j.Logger;
7+
import org.slf4j.LoggerFactory;
8+
import ru.untitled_devs.core.dispatcher.Dispatcher;
9+
import ru.untitled_devs.core.fsm.storage.InMemoryStorage;
10+
import ru.untitled_devs.core.fsm.storage.Storage;
11+
import ru.untitled_devs.core.routers.scenes.SceneManager;
12+
13+
public class CoreModule extends AbstractModule {
14+
@Override protected void configure() {}
15+
16+
@Provides @Singleton
17+
Logger logger() {
18+
return LoggerFactory.getLogger("bot");
19+
}
20+
21+
@Provides @Singleton
22+
Storage storage() {
23+
return new InMemoryStorage();
24+
}
25+
26+
@Provides @Singleton
27+
SceneManager sceneManager() {
28+
return new SceneManager();
29+
}
30+
31+
@Provides @Singleton
32+
Dispatcher dispatcher(Storage storage, SceneManager sceneManager) {
33+
return new Dispatcher(storage, sceneManager);
34+
}
35+
}
Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
package ru.untitled_devs.bot.di;
2+
3+
import com.google.inject.AbstractModule;
4+
import com.google.inject.Singleton;
5+
import ru.untitled_devs.bot.features.localisation.LocalisationMiddleware;
6+
import ru.untitled_devs.bot.features.localisation.LocalisationScene;
7+
import ru.untitled_devs.bot.features.menu.MainMenuScene;
8+
import ru.untitled_devs.bot.features.prfile.ProfileScene;
9+
import ru.untitled_devs.bot.features.registration.LoginMiddleware;
10+
import ru.untitled_devs.bot.features.registration.ProfilePreviewService;
11+
import ru.untitled_devs.bot.features.registration.RegistrationScene;
12+
import ru.untitled_devs.bot.features.registration.RegistrationService;
13+
import ru.untitled_devs.bot.features.start.StartMiddleware;
14+
15+
public class FeaturesModule extends AbstractModule {
16+
@Override
17+
protected void configure() {
18+
bind(RegistrationService.class).in(Singleton.class);
19+
bind(ProfilePreviewService.class).in(Singleton.class);
20+
21+
bind(RegistrationScene.class).in(Singleton.class);
22+
bind(LocalisationScene.class).in(Singleton.class);
23+
bind(MainMenuScene.class).in(Singleton.class);
24+
bind(ProfileScene.class).in(Singleton.class);
25+
26+
bind(LocalisationMiddleware.class).in(Singleton.class);
27+
bind(LoginMiddleware.class).in(Singleton.class);
28+
29+
bind(StartMiddleware.class).in(Singleton.class);
30+
}
31+
32+
}
Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
package ru.untitled_devs.bot.di;
2+
3+
import com.google.inject.AbstractModule;
4+
import com.google.inject.Provides;
5+
import com.google.inject.Singleton;
6+
import com.mongodb.client.MongoClient;
7+
import com.mongodb.client.MongoClients;
8+
import dev.morphia.Datastore;
9+
import dev.morphia.Morphia;
10+
import ru.untitled_devs.bot.config.MongoConfig;
11+
12+
public class MongoModule extends AbstractModule {
13+
@Override
14+
protected void configure() {
15+
16+
}
17+
18+
@Provides @Singleton
19+
MongoClient mongoClient(MongoConfig cfg) {
20+
return MongoClients.create(cfg.getMongoString());
21+
}
22+
23+
@Provides @Singleton
24+
Datastore datastore(MongoClient client, MongoConfig cfg) {
25+
return Morphia.createDatastore(client, cfg.getMongoDBName());
26+
}
27+
28+
29+
}
Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
package ru.untitled_devs.bot.di;
2+
3+
import com.google.inject.AbstractModule;
4+
import com.google.inject.Provides;
5+
import com.google.inject.Singleton;
6+
import dev.morphia.Datastore;
7+
import ru.untitled_devs.bot.config.GeocodingConfig;
8+
import ru.untitled_devs.bot.config.S3Config;
9+
import ru.untitled_devs.bot.shared.geocoder.Geocoder;
10+
import ru.untitled_devs.bot.shared.geocoder.yandex.YandexGeocoder;
11+
import ru.untitled_devs.bot.shared.image.ImageService;
12+
import software.amazon.awssdk.auth.credentials.AwsCredentials;
13+
import software.amazon.awssdk.auth.credentials.AwsBasicCredentials;
14+
import software.amazon.awssdk.regions.Region;
15+
16+
import java.net.URI;
17+
18+
public class SharedModule extends AbstractModule {
19+
@Override
20+
protected void configure() {
21+
22+
}
23+
24+
@Provides @Singleton
25+
Geocoder geocoder(GeocodingConfig cfg) {
26+
return new YandexGeocoder(cfg.getApiUrl(), cfg.getApiKey());
27+
}
28+
29+
@Provides @Singleton
30+
AwsCredentials awsCredentials(S3Config cfg) {
31+
return AwsBasicCredentials.create(cfg.getAccessKey(), cfg.getSecretKey());
32+
}
33+
34+
@Provides @Singleton
35+
ImageService imageService(S3Config cfg, AwsCredentials creds, Datastore datastore) {
36+
URI endpoint = URI.create(cfg.getEndpoint());
37+
Region region = Region.US_EAST_1;
38+
return new ImageService(endpoint, creds, region, cfg.getBucketName(), datastore);
39+
}
40+
}
Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
package ru.untitled_devs.bot.di;
2+
3+
import com.google.inject.AbstractModule;
4+
import com.google.inject.Provides;
5+
import com.google.inject.Singleton;
6+
import org.telegram.telegrambots.meta.TelegramBotsApi;
7+
import org.telegram.telegrambots.updatesreceivers.DefaultBotSession;
8+
import ru.untitled_devs.bot.config.BotConfig;
9+
import ru.untitled_devs.core.client.BotClient;
10+
import ru.untitled_devs.core.client.PollingClient;
11+
import ru.untitled_devs.core.dispatcher.Dispatcher;
12+
13+
public class TelegramModule extends AbstractModule {
14+
@Override protected void configure() {
15+
}
16+
17+
@Provides @Singleton
18+
TelegramBotsApi botsApi() throws Exception {
19+
return new TelegramBotsApi(DefaultBotSession.class);
20+
}
21+
22+
@Provides @Singleton
23+
PollingClient pollingClient(BotConfig cfg, Dispatcher dispatcher) {
24+
return new PollingClient(cfg.getBotToken(), cfg.getBotName(), dispatcher);
25+
}
26+
27+
@Provides @Singleton
28+
BotClient botClient(PollingClient client) {
29+
return client;
30+
}
31+
}

0 commit comments

Comments
 (0)