рдЯреЗрд▓реАрдЧреНрд░рд╛рдо рдмреЙрдЯ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЬрд╛рд╡рд╛ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг

рд╣рд░ рдбреЗрд╡рд▓рдкрд░ (рдФрд░ рди рдХреЗрд╡рд▓) рдЬреЛ рд░реЛрдЬрдорд░реНрд░рд╛ рдХреА рдЬрд┐рдВрджрдЧреА рдореЗрдВ рдЯреЗрд▓реАрдЧреНрд░рд╛рдо рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ, рдХрдо рд╕реЗ рдХрдо рдПрдХ рдмрд╛рд░ рдЗрд╕ рдмрд╛рд░реЗ рдореЗрдВ рд╕реЛрдЪрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдХреИрд╕реЗ рдЕрдкрдирд╛ рдмреЙрдЯ рдмрдирд╛рдирд╛ рдорд╣рд╕реВрд╕ рдХрд░рддрд╛ рд╣реИ, рдпрд╣ рдХрд┐рддрдирд╛ рдореБрд╢реНрдХрд┐рд▓ рд╣реИ рдФрд░ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рднрд╛рд╖рд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рд╣реИред


рдореИрдВ рдЗрди рд╕рднреА рд╕рд╡рд╛рд▓реЛрдВ рдХрд╛ рд╕рдмрд╕реЗ рд╕рд░рд▓ (рдФрд░ рд╢рд╛рдпрдж рд╕рдмрд╕реЗ рд╕рд╣реА) рдЙрддреНрддрд░ рджреЗ рд╕рдХрддрд╛ рд╣реВрдВ: рдпрд╣ рд╕рдм рдЕрдкрдиреЗ рдЖрдк рдкрд░, рдЖрдкрдХреЗ рдЬреНрдЮрд╛рди рдФрд░ рдЗрд░рд╛рджреЛрдВ рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддрд╛ рд╣реИред


... рд▓реЗрдХрд┐рди рдЗрд╕ рдЫреЛрдЯреЗ рд╕реЗ рд▓реЗрдЦ рдореЗрдВ, рдореИрдВ рджрд┐рдЦрд╛рдКрдВрдЧрд╛ рдХрд┐ рдЖрдк рдЬрд╛рд╡рд╛ рдореЗрдВ рдЕрдкрдирд╛ рдмреЙрдЯ рдХреИрд╕реЗ рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдпрд╣ рдХрд╛рдлреА рджрд┐рд▓рдЪрд╕реНрдк рдФрд░ рд╕рд░рд▓ рд╣реИред


рд╣рдо рдЯреЗрд▓реАрдЧреНрд░рд╛рдо рдмреЙрдЯреНрд╕ рдПрдкреАрдЖрдИ рдФрд░ рдЗрд╕рдХреЗ рд╡рд┐рд╕реНрддрд╛рд░ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗ, рдЬреЛ рд╣рдореЗрдВ рдЕрдкрдиреЗ рд╕реНрд╡рдпрдВ рдХреЗ рдХрдорд╛рдВрдб (' /custom_cmd ') рдмрдирд╛рдиреЗ рдФрд░ рдЙрдиреНрд╣реЗрдВ рд╕рд░рд▓ рддрд░реАрдХреЗ рд╕реЗ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред


рдмреЙрдЯ рдХрд╛ рдХрд╛рд░реНрдп рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ рдкрдВрдЬреАрдХреГрдд рдХрд░рдирд╛ рдФрд░ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдмреЙрдЯ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЛ рдЕрдиреНрдп рдирд╛рдо рд╕реЗ рд╕рдВрджреЗрд╢ рднреЗрдЬрдирд╛ рд╣реЛрдЧрд╛ред


рдПрдХ рдирдИ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдФрд░ рддреИрдпрд╛рд░реА рдХрд╛ рдирд┐рд░реНрдорд╛рдг


1. рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреЗ рд▓рд┐рдП рдирд┐рд░реНрднрд░рддрд╛ рдЬреЛрдбрд╝реЗрдВ


рдПрдХ рдирдИ рдорд╛рд╡реЗрди рдкрд░рд┐рдпреЛрдЬрдирд╛ рдмрдирд╛рдПрдВ рдФрд░ рдЗрд╕рдореЗрдВ рдЖрд╡рд╢реНрдпрдХ рдирд┐рд░реНрднрд░рддрд╛ рдЬреЛрдбрд╝рддреЗ рд╣реБрдП pom.xml рд╕рдВрдкрд╛рджрд┐рдд рдХрд░реЗрдВ:


pom.xml
  <?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> <groupId>io.example</groupId> <artifactId>anonymizerbot</artifactId> <version>1.0-SNAPSHOT</version> <build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <configuration> ```8</source> <target>8</target> </configuration> </plugin> </plugins> </build> <dependencies> <!-- Telegram API --> <dependency> <groupId>org.telegram</groupId> <artifactId>telegrambots</artifactId> <version>LATEST</version> </dependency> <dependency> <groupId>org.telegram</groupId> <artifactId>telegrambotsextensions</artifactId> <version>LATEST</version> </dependency> ... </dependencies> </project> 

рдЯреЗрд▓реАрдЧреНрд░рд╛рдо рдПрдкреАрдЖрдИ - рдЯреЗрд▓реАрдЧреНрд░рд╛рдо рдмреЙрдЯреНрд╕ рдПрдкреАрдЖрдИ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдкреБрд╕реНрддрдХрд╛рд▓рдп , рдЯреЗрд▓реАрдЧреНрд░рд╛рдо рд╕реЗрд╡рд╛рдУрдВ рдФрд░ рдЗрди рд╡рд░реНрдЧреЛрдВ рдХреЗ рдХреБрдЫ рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдХреЗ рд╕рд╛рде рдмрд╛рддрдЪреАрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрдХреНрд╖рд╛рдПрдВ рдФрд░ рддрд░реАрдХреЗ рд╢рд╛рдорд┐рд▓ рд╣реИрдВред


2. рдмреЙрдЯ рдХреЗ рд▓рд┐рдП рдПрдХ рдЦрд╛рддрд╛ рдмрдирд╛рдирд╛


рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдореЗрдВ рд╕рд╣рд╛рдпрддрд╛ рдХреЗ рд▓рд┐рдП рдмреЙрдЯрдлрд╝рд╛рджрд░ рдмреЙрдЯ рд╕реЗ рд╕рдВрдкрд░реНрдХ рдХрд░рдирд╛ рд╣реЛрдЧрд╛:


  • рдЦреЛрдЬ рдореЗрдВ рдмреЙрдЯ рдорд┐рд▓;
  • рдХрдорд╛рдВрдб "/ рдкреНрд░рд╛рд░рдВрдн" рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░реЗрдВ;
  • рдХрдорд╛рдВрдб рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░реЗрдВ "/ рдиреНрдпреВрдмреЙрдЯ";
  • рдЪрд▓реЛ рд╣рдорд╛рд░реЗ рдмреЙрдЯ рдХреЗ рд▓рд┐рдП рдХреБрдЫ рдирд╛рдо рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░реЗрдВ (рдпрд╣ "рдмреЙрдЯ" рдХреЗ рд╕рд╛рде рд╕рдорд╛рдкреНрдд рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП)ред рдореИрдВрдиреЗ рдЗрд╕реЗ "ExampleOfAnonymizerBot" рдХрд╣рд╛ред

рдЗрди рдЖрджреЗрд╢реЛрдВ рдХреЛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рд╣рдореЗрдВ рдЯреЛрдХрди рдорд┐рд▓реЗрдЧрд╛ рдЬреЛ рд╣рдореЗрдВ рдмреЙрдЯ рдПрдкреАрдЖрдИ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред (7xxxxxxx2: Axxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx0)






рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди


1. рд╕рдВрджреЗрд╢реЛрдВ рдХреЗ рдЧреБрдордирд╛рдо рдкреНрд░реЗрд╖рдХ рдХрд╛ рдореЙрдбрд▓


рдкреНрд░рддреНрдпреЗрдХ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рд╕реЗ рд╣рдореЗрдВ рдЬреЛ рдбреЗрдЯрд╛ рдЪрд╛рд╣рд┐рдП:


  • рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ mUser - рдЯреЗрд▓реАрдЧреНрд░рд╛рдо рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирдХрд╛рд░реА;
  • рдЪреИрдЯ mChat - рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдФрд░ рдмреЙрдЯ рдЪреИрдЯ рдЬрд╛рдирдХрд╛рд░реА;
  • рд╕реНрдЯреНрд░рд┐рдВрдЧ mDisplayedName - рд╡рд╣ рдирд╛рдо рдЬрд┐рд╕рд╕реЗ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдмреЙрдЯ рдХреЗ рдЕрдиреНрдп рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЛ рд╕рдВрджреЗрд╢ рднреЗрдЬреЗрдЧрд╛ред

Anonymous.java
 package io.example.anonymizerbot.model; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import org.telegram.telegrambots.meta.api.objects.Chat; import org.telegram.telegrambots.meta.api.objects.User; public final class Anonymous { private static final Logger LOG = LogManager.getLogger(Anonymous.class); private static final String USER_CHAT_CANNOT_BE_NULL = "User or chat cannot be null!"; private final User mUser; private final Chat mChat; private String mDisplayedName; public Anonymous(User user, Chat chat) { if (user == null || chat == null) { LOG.error(USER_CHAT_CANNOT_BE_NULL); throw new IllegalStateException(USER_CHAT_CANNOT_BE_NULL); } mUser = user; mChat = chat; } @Override public int hashCode() { return mUser.hashCode(); } @Override public boolean equals(Object obj) { return obj instanceof Anonymous && ((Anonymous) obj).getUser().equals(mUser); } public User getUser() { return mUser; } public Chat getChat() { return mChat; } public String getDisplayedName() { return mDisplayedName; } public void setDisplayedName(String displayedName) { mDisplayedName = displayedName; } } 

рдПрдХ рд╕реЗрд╡рд╛ рдЬреЛрдбрд╝реЗрдВ рдЬрд┐рд╕рдореЗрдВ рдХрдИ рдЧреБрдордирд╛рдо рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЛ рд╣реЗрд░рдлреЗрд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдорддреМрд░ рдкрд░ рдЙрдкрдпреЛрдЧ рдХреА рдЬрд╛рдиреЗ рд╡рд╛рд▓реА рд╡рд┐рдзрд┐рдпрд╛рдВ рд╣реИрдВред


AnonymousService.java
 package io.example.anonymizerbot.service; import io.example.anonymizerbot.model.Anonymous; import org.telegram.telegrambots.meta.api.objects.User; import java.util.HashSet; import java.util.Objects; import java.util.Set; import java.util.stream.Stream; public final class AnonymousService { private final Set<Anonymous> mAnonymouses; public AnonymousService() { mAnonymouses = new HashSet<>(); } public boolean setUserDisplayedName(User user, String name) { if (!isDisplayedNameTaken(name)) { mAnonymouses.stream().filter(a -> a.getUser().equals(user)).forEach(a -> a.setDisplayedName(name)); return true; } return false; } public boolean removeAnonymous(User user) { return mAnonymouses.removeIf(a -> a.getUser().equals(user)); } public boolean addAnonymous(Anonymous anonymous) { return mAnonymouses.add(anonymous); } public boolean hasAnonymous(User user) { return mAnonymouses.stream().anyMatch(a -> a.getUser().equals(user)); } public String getDisplayedName(User user) { Anonymous anonymous = mAnonymouses.stream().filter(a -> a.getUser().equals(user)).findFirst().orElse(null); if (anonymous == null) { return null; } return anonymous.getDisplayedName(); } public Stream<Anonymous> anonymouses() { return mAnonymouses.stream(); } private boolean isDisplayedNameTaken(String name) { return mAnonymouses.stream().anyMatch(a -> Objects.equals(a.getDisplayedName(), name)); } } 

2. рдмреЙрдЯ рдЗрдВрдЯрд░рдлреЗрд╕


рдХрд┐рд╕реА рднреА рдХрд╕реНрдЯрдо рдХрдорд╛рдВрдб рдХреЛ BotCommand рд╕реЗ рд╡рд┐рд░рд╛рд╕рдд рдореЗрдВ рдорд┐рд▓рдиреА рдЪрд╛рд╣рд┐рдП рдФрд░ рдПрдХ рд╡рд┐рдзрд┐ рд▓рд╛рдЧреВ рдХрд░рдиреА рдЪрд╛рд╣рд┐рдП
execute(AbsSender sender, User user, Chat chat, String[] strings) , рдЬреЛ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдЖрджреЗрд╢реЛрдВ рдХреЛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред


рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЗ рдЖрджреЗрд╢ рдХреЛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рд╣рдо рдЙрд╕реЗ AbsSender рд╡рд░реНрдЧ рдХреЗ execute рд╡рд┐рдзрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдПрдХ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рднреЗрдЬ рд╕рдХрддреЗ рд╣реИрдВ, рдЬреЛ рдХрд┐ рдЙрдкрд░реНрдпреБрдХреНрдд execute(AbsSender sender, User user, Chat chat, String[] strings) рд▓реЗрддрд╛ рд╣реИред


рдЗрд╕рдХреЗ рдмрд╛рдж, рдкреНрд░рддреНрдпреЗрдХ рдмрд╛рд░ AbsSender.execute рдкрджреНрдзрддрд┐ рдХреЛ рд▓рдкреЗрдЯрдиреЗ рдХреЗ рд▓рд┐рдП рдирд╣реАрдВ, рдЬреЛ рдХрд┐ TelegramApiException рдХреЛ рдлреЗрдВрдХ рд╕рдХрддрд╛ рд╣реИ, try-catch , рдФрд░ рдкреНрд░рддреНрдпреЗрдХ рдХрдорд╛рдВрдб рдореЗрдВ рдиреАрд░рд╕ рд▓реЙрдЧ рдирд╣реАрдВ рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо AnonymizerCommand рдХреНрд▓рд╛рд╕ рдмрдирд╛рдПрдВрдЧреЗ, рдФрд░ рд╣рдо рдЗрд╕рдореЗрдВ рд╕реЗ рдЕрдкрдиреЗ рдХрд╕реНрдЯрдо рдХрдорд╛рдВрдб рдХреЛ рдЗрдирд╣реЗрд░рд┐рдЯ рдХрд░реЗрдВрдЧреЗред (рд╣рдо рдЗрд╕ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ рдЕрдкрд╡рд╛рдж рдХреЛ рдЫреЛрдбрд╝ рджреЗрдВрдЧреЗ):


AnonymizerCommand.java
 package io.example.anonymizerbot.command; import io.example.anonymizerbot.logger.LogLevel; import io.example.anonymizerbot.logger.LogTemplate; import org.apache.logging.log4j.Level; import org.apache.logging.log4j.Logger; import org.apache.logging.log4j.LogManager; import org.telegram.telegrambots.extensions.bots.commandbot.commands.BotCommand; import org.telegram.telegrambots.meta.api.methods.send.SendMessage; import org.telegram.telegrambots.meta.api.objects.User; import org.telegram.telegrambots.meta.bots.AbsSender; import org.telegram.telegrambots.meta.exceptions.TelegramApiException; abstract class AnonymizerCommand extends BotCommand { final Logger log = LogManager.getLogger(getClass()); AnonymizerCommand(String commandIdentifier, String description) { super(commandIdentifier, description); } void execute(AbsSender sender, SendMessage message, User user) { try { sender.execute(message); log.log(Level.getLevel(LogLevel.SUCCESS.getValue()), LogTemplate.COMMAND_SUCCESS.getTemplate(), user.getId(), getCommandIdentifier()); } catch (TelegramApiException e) { log.error(LogTemplate.COMMAND_EXCEPTION.getTemplate(), user.getId(), getCommandIdentifier(), e); } } } 

рдЙрди рдХрдорд╛рдВрдб рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░реЗрдВ рдЬрд┐рди рдкрд░ рд╣рдорд╛рд░реЗ рдмреЙрдЯ рдЬрд╡рд╛рдм рджреЗрдВрдЧреЗ:


  • /start - рдПрдХ рдирд╛рдо рдХреЗ рдмрд┐рдирд╛ рдПрдХ рдирдпрд╛ Anonymous рдмрдирд╛рдПрдВ рдФрд░ рдЗрд╕реЗ Anonymouses рд╕рдВрдЧреНрд░рд╣ рдореЗрдВ рдЬреЛрдбрд╝реЗрдВ;

StartCommand.java
 package io.example.anonymizerbot.command; import io.example.anonymizerbot.logger.LogLevel; import io.example.anonymizerbot.logger.LogTemplate; import io.example.anonymizerbot.model.Anonymous; import io.example.anonymizerbot.service.AnonymousService; import org.apache.logging.log4j.Level; import org.telegram.telegrambots.meta.api.methods.send.SendMessage; import org.telegram.telegrambots.meta.api.objects.Chat; import org.telegram.telegrambots.meta.api.objects.User; import org.telegram.telegrambots.meta.bots.AbsSender; public final class StartCommand extends AnonymizerCommand { private final AnonymousService mAnonymouses; //     , //        public StartCommand(AnonymousService anonymouses) { super("start", "start using bot\n"); mAnonymouses = anonymouses; } /** *    BotCommand,    ,   * @param absSender -    * @param user - ,    * @param chat -     * @param strings - ,    */ @Override public void execute(AbsSender absSender, User user, Chat chat, String[] strings) { log.info(LogTemplate.COMMAND_PROCESSING.getTemplate(), user.getId(), getCommandIdentifier()); StringBuilder sb = new StringBuilder(); SendMessage message = new SendMessage(); message.setChatId(chat.getId().toString()); if (mAnonymouses.addAnonymous(new Anonymous(user, chat))) { log.info("User {} is trying to execute '{}' the first time. Added to users' list.", user.getId(), getCommandIdentifier()); sb.append("Hi, ").append(user.getUserName()).append("! You've been added to bot users' list!\n") .append("Please execute command:\n'/set_name <displayed_name>'\nwhere &lt;displayed_name&gt; is the name you want to use to hide your real name."); } else { log.log(Level.getLevel(LogLevel.STRANGE.getValue()), "User {} has already executed '{}'. Is he trying to do it one more time?", user.getId(), getCommandIdentifier()); sb.append("You've already started bot! You can send messages if you set your name (/set_name)."); } message.setText(sb.toString()); execute(absSender, message, user); } } 

  • /help - рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЗ рд▓рд┐рдП рд╕рднреА рдЙрдкрд▓рдмреНрдз рдЖрджреЗрд╢реЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирдХрд╛рд░реА рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рддрд╛ рд╣реИ (рдирд┐рд░реНрдорд╛рдгрдХрд░реНрддрд╛ рджреВрд╕рд░реЛрдВ рд╕реЗ рдЕрд▓рдЧ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рдЖрдкрдХреЛ ICommandRegistry рдкрд╛рд╕ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдЬрд┐рд╕рдореЗрдВ рд╕рднреА рдХрд╕реНрдЯрдо рдХрдорд╛рдВрдб рд╢рд╛рдорд┐рд▓ рд╣реИрдВ);

HelpCommand.java
 package io.example.anonymizerbot.command; import io.example.anonymizerbot.logger.LogTemplate; import org.telegram.telegrambots.extensions.bots.commandbot.commands.ICommandRegistry; import org.telegram.telegrambots.meta.api.methods.send.SendMessage; import org.telegram.telegrambots.meta.api.objects.Chat; import org.telegram.telegrambots.meta.api.objects.User; import org.telegram.telegrambots.meta.bots.AbsSender; public final class HelpCommand extends AnonymizerCommand { private final ICommandRegistry mCommandRegistry; public HelpCommand(ICommandRegistry commandRegistry) { super("help", "list all known commands\n"); mCommandRegistry = commandRegistry; } @Override public void execute(AbsSender absSender, User user, Chat chat, String[] strings) { log.info(LogTemplate.COMMAND_PROCESSING.getTemplate(), user.getId(), getCommandIdentifier()); StringBuilder helpMessageBuilder = new StringBuilder("<b>Available commands:</b>"); mCommandRegistry.getRegisteredCommands().forEach(cmd -> helpMessageBuilder.append(cmd.toString()).append("\n")); SendMessage helpMessage = new SendMessage(); helpMessage.setChatId(chat.getId().toString()); helpMessage.enableHtml(true); helpMessage.setText(helpMessageBuilder.toString()); execute(absSender, helpMessage, user); } } 

  • /set_name - рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ рдПрдХ рдирд╛рдо /set_name рд╣реИ рдЬрд┐рд╕рд╕реЗ рдЧреБрдордирд╛рдо рд╕рдВрджреЗрд╢ рднреЗрдЬреЗ рдЬрд╛рдПрдВрдЧреЗ;

SetNameCommand.java
 package io.example.anonymizerbot.command; import io.example.anonymizerbot.logger.LogLevel; import io.example.anonymizerbot.logger.LogTemplate; import io.example.anonymizerbot.service.AnonymousService; import org.apache.logging.log4j.Level; import org.telegram.telegrambots.meta.api.methods.send.SendMessage; import org.telegram.telegrambots.meta.api.objects.Chat; import org.telegram.telegrambots.meta.api.objects.User; import org.telegram.telegrambots.meta.bots.AbsSender; public final class SetNameCommand extends AnonymizerCommand { private final AnonymousService mAnonymouses; public SetNameCommand(AnonymousService anonymouses) { super("set_name", "set or change name that will be displayed with your messages\n"); mAnonymouses = anonymouses; } @Override public void execute(AbsSender absSender, User user, Chat chat, String[] strings) { log.info(LogTemplate.COMMAND_PROCESSING.getTemplate(), user.getId(), getCommandIdentifier()); SendMessage message = new SendMessage(); message.setChatId(chat.getId().toString()); if (!mAnonymouses.hasAnonymous(user)) { log.log(Level.getLevel(LogLevel.STRANGE.getValue()), "User {} is trying to execute '{}' without starting the bot!", user.getId(), getCommandIdentifier()); message.setText("Firstly you should start the bot! Execute '/start' command!"); execute(absSender, message, user); return; } String displayedName = getName(strings); if (displayedName == null) { log.log(Level.getLevel(LogLevel.STRANGE.getValue()), "User {} is trying to set empty name.", user.getId()); message.setText("You should use non-empty name!"); execute(absSender, message, user); return; } StringBuilder sb = new StringBuilder(); if (mAnonymouses.setUserDisplayedName(user, displayedName)) { if (mAnonymouses.getDisplayedName(user) == null) { log.info("User {} set a name '{}'", user.getId(), displayedName); sb.append("Your displayed name: '").append(displayedName) .append("'. Now you can send messages to bot!"); } else { log.info("User {} has changed name to '{}'", user.getId(), displayedName); sb.append("Your new displayed name: '").append(displayedName).append("'."); } } else { log.log(Level.getLevel(LogLevel.STRANGE.getValue()), "User {} is trying to set taken name '{}'", user.getId(), displayedName); sb.append("Name ").append(displayedName).append(" is already in use! Choose another name!"); } message.setText(sb.toString()); execute(absSender, message, user); } private String getName(String[] strings) { if (strings == null || strings.length == 0) { return null; } String name = String.join(" ", strings); return name.replaceAll(" ", "").isEmpty() ? null : name; } } 

  • /my_name - рд╡рд░реНрддрдорд╛рди рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдирд╛рдо рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рддрд╛ рд╣реИ;

MyNameCommand.java
 package io.example.anonymizerbot.command; import io.example.anonymizerbot.logger.LogLevel; import io.example.anonymizerbot.logger.LogTemplate; import io.example.anonymizerbot.service.AnonymousService; import org.apache.logging.log4j.Level; import org.telegram.telegrambots.meta.api.methods.send.SendMessage; import org.telegram.telegrambots.meta.api.objects.Chat; import org.telegram.telegrambots.meta.api.objects.User; import org.telegram.telegrambots.meta.bots.AbsSender; public final class MyNameCommand extends AnonymizerCommand { private final AnonymousService mAnonymouses; public MyNameCommand(AnonymousService anonymouses) { super("my_name", "show your current name that will be displayed with your messages\n"); mAnonymouses = anonymouses; } @Override public void execute(AbsSender absSender, User user, Chat chat, String[] strings) { log.info(LogTemplate.COMMAND_PROCESSING.getTemplate(), user.getId(), getCommandIdentifier()); StringBuilder sb = new StringBuilder(); SendMessage message = new SendMessage(); message.setChatId(chat.getId().toString()); if (!mAnonymouses.hasAnonymous(user)) { sb.append("You are not in bot users' list! Send /start command!"); log.log(Level.getLevel(LogLevel.STRANGE.getValue()), "User {} is trying to execute '{}' without starting the bot.", user.getId(), getCommandIdentifier()); } else if(mAnonymouses.getDisplayedName(user) == null) { sb.append("Currently you don't have a name.\nSet it using command:\n'/set_name &lt;displayed_name&gt;'"); log.log(Level.getLevel(LogLevel.STRANGE.getValue()), "User {} is trying to execute '{}' without having a name.", user.getId(), getCommandIdentifier()); } else { log.info("User {} is executing '{}'. Name is '{}'.", user.getId(), getCommandIdentifier(), mAnonymouses.getDisplayedName(user)); sb.append("Your current name: ").append(mAnonymouses.getDisplayedName(user)); } message.setText(sb.toString()); execute(absSender, message, user); } } 

  • /stop - рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ рдЕрдЬреНрдЮрд╛рдд рд╕рдВрдЧреНрд░рд╣ рд╕реЗ рдирд┐рдХрд╛рд▓рддрд╛ рд╣реИред

StopCommand.java
 package io.example.anonymizerbot.command; import io.example.anonymizerbot.logger.LogLevel; import io.example.anonymizerbot.logger.LogTemplate; import io.example.anonymizerbot.service.AnonymousService; import org.apache.logging.log4j.Level; import org.telegram.telegrambots.meta.api.methods.send.SendMessage; import org.telegram.telegrambots.meta.api.objects.Chat; import org.telegram.telegrambots.meta.api.objects.User; import org.telegram.telegrambots.meta.bots.AbsSender; public final class StopCommand extends AnonymizerCommand { private final AnonymousService mAnonymouses; public StopCommand(AnonymousService anonymouses) { super("stop", "remove yourself from bot users' list\n"); mAnonymouses = anonymouses; } @Override public void execute(AbsSender absSender, User user, Chat chat, String[] strings) { log.info(LogTemplate.COMMAND_PROCESSING.getTemplate(), user.getId(), getCommandIdentifier()); StringBuilder sb = new StringBuilder(); SendMessage message = new SendMessage(); message.setChatId(chat.getId().toString()); if (mAnonymouses.removeAnonymous(user)) { log.info("User {} has been removed from users list!", user.getId()); sb.append("You've been removed from bot's users list! Bye!"); } else { log.log(Level.getLevel(LogLevel.STRANGE.getValue()), "User {} is trying to execute '{}' without having executed 'start' before!", user.getId(), getCommandIdentifier()); sb.append("You were not in bot users' list. Bye!"); } message.setText(sb.toString()); execute(absSender, message, user); } } 

3. рдмреЙрдЯ рдХрд╛ рдкреНрд░рд╛рд░рдВрдн рдФрд░ рдкреНрд░рдХреНрд╖реЗрдкрдг


рдПрдХ рдмреЙрдЯ рдХреНрд▓рд╛рд╕ рдЬрд┐рд╕рдореЗрдВ рд╕рднреА рдХрд╕реНрдЯрдо рдХрдорд╛рдВрдб, рдиреЙрди-рдХрдорд╛рдВрдб рдХреЗ рдПрдХ рд╕рдВрджреЗрд╢ рд╣реИрдВрдбрд▓рд░, рдФрд░ рдЕрдЬреНрдЮрд╛рдд рдХрдорд╛рдВрдб рдкрдВрдЬреАрдХреГрдд рд╣реИрдВред


AnonymizerBot.java
 package io.example.anonymizerbot.bot; import io.example.anonymizerbot.command.*; import io.example.anonymizerbot.logger.LogLevel; import io.example.anonymizerbot.logger.LogTemplate; import io.example.anonymizerbot.model.Anonymous; import io.example.anonymizerbot.service.AnonymousService; import org.apache.logging.log4j.Level; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import org.telegram.telegrambots.bots.DefaultBotOptions; import org.telegram.telegrambots.extensions.bots.commandbot.TelegramLongPollingCommandBot; import org.telegram.telegrambots.meta.api.methods.send.SendMessage; 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.exceptions.TelegramApiException; import java.util.stream.Stream; public final class AnonymizerBot extends TelegramLongPollingCommandBot { private static final Logger LOG = LogManager.getLogger(AnonymizerBot.class); //  ,        BotFather //  ,     private static final String BOT_NAME = "AnonymizerBotExample"; private static final String BOT_TOKEN = "7xxxxxxx2:Axxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx0"; private final AnonymousService mAnonymouses; public AnonymizerBot(DefaultBotOptions botOptions) { super(botOptions, BOT_NAME); LOG.info("Initializing Anonymizer Bot..."); LOG.info("Initializing anonymouses list..."); mAnonymouses = new AnonymousService(); //     LOG.info("Registering commands..."); LOG.info("Registering '/start'..."); register(new StartCommand( mAnonymouses)); LOG.info("Registering '/set_name'..."); register(new SetNameCommand(mAnonymouses)); LOG.info("Registering '/stop'..."); register(new StopCommand(mAnonymouses)); LOG.info("Registering '/my_name'..."); register(new MyNameCommand(mAnonymouses)); HelpCommand helpCommand = new HelpCommand(this); LOG.info("Registering '/help'..."); register(helpCommand); //    LOG.info("Registering default action'..."); registerDefaultAction(((absSender, message) -> { LOG.log(Level.getLevel(LogLevel.STRANGE.getValue()), "User {} is trying to execute unknown command '{}'.", message.getFrom().getId(), message.getText()); SendMessage text = new SendMessage(); text.setChatId(message.getChatId()); text.setText(message.getText() + " command not found!"); try { absSender.execute(text); } catch (TelegramApiException e) { LOG.error("Error while replying unknown command to user {}.", message.getFrom(), e); } helpCommand.execute(absSender, message.getFrom(), message.getChat(), new String[] {}); })); } @Override public String getBotToken() { return BOT_TOKEN; } //      '/' @Override public void processNonCommandUpdate(Update update) { LOG.info("Processing non-command update..."); if (!update.hasMessage()) { LOG.error("Update doesn't have a body!"); throw new IllegalStateException("Update doesn't have a body!"); } Message msg = update.getMessage(); User user = msg.getFrom(); LOG.info(LogTemplate.MESSAGE_PROCESSING.getTemplate(), user.getId()); if (!canSendMessage(user, msg)) { return; } String clearMessage = msg.getText(); String messageForUsers = String.format("%s:\n%s", mAnonymouses.getDisplayedName(user), msg.getText()); SendMessage answer = new SendMessage(); //     ,     answer.setText(clearMessage); answer.setChatId(msg.getChatId()); replyToUser(answer, user, clearMessage); //       answer.setText(messageForUsers); Stream<Anonymous> anonymouses = mAnonymouses.anonymouses(); anonymouses.filter(a -> !a.getUser().equals(user)) .forEach(a -> { answer.setChatId(a.getChat().getId()); sendMessageToUser(answer, a.getUser(), user); }); } //  ,        private boolean canSendMessage(User user, Message msg) { SendMessage answer = new SendMessage(); answer.setChatId(msg.getChatId()); if (!msg.hasText() || msg.getText().trim().length() == 0) { LOG.log(Level.getLevel(LogLevel.STRANGE.getValue()), "User {} is trying to send empty message!", user.getId()); answer.setText("You shouldn't send empty messages!"); replyToUser(answer, user, msg.getText()); return false; } if(!mAnonymouses.hasAnonymous(user)) { LOG.log(Level.getLevel(LogLevel.STRANGE.getValue()), "User {} is trying to send message without starting the bot!", user.getId()); answer.setText("Firstly you should start bot! Use /start command!"); replyToUser(answer, user, msg.getText()); return false; } if (mAnonymouses.getDisplayedName(user) == null) { LOG.log(Level.getLevel(LogLevel.STRANGE.getValue()), "User {} is trying to send message without setting a name!", user.getId()); answer.setText("You must set a name before sending messages.\nUse '/set_name <displayed_name>' command."); replyToUser(answer, user, msg.getText()); return false; } return true; } private void sendMessageToUser(SendMessage message, User receiver, User sender) { try { execute(message); LOG.log(Level.getLevel(LogLevel.SUCCESS.getValue()), LogTemplate.MESSAGE_RECEIVED.getTemplate(), receiver.getId(), sender.getId()); } catch (TelegramApiException e) { LOG.error(LogTemplate.MESSAGE_LOST.getTemplate(), receiver.getId(), sender.getId(), e); } } private void replyToUser(SendMessage message, User user, String messageText) { try { execute(message); LOG.log(Level.getLevel(LogLevel.SUCCESS.getValue()), LogTemplate.MESSAGE_SENT.getTemplate(), user.getId(), messageText); } catch (TelegramApiException e) { LOG.error(LogTemplate.MESSAGE_EXCEPTION.getTemplate(), user.getId(), e); } } } 

рдЕрдВрдд рдореЗрдВ, рдмреЙрдЯ рд▓реЙрдиреНрдЪ рдХрд░реЗрдВ:


BotInitializer.java
 package io.example.anonymizerbot; import io.example.anonymizerbot.bot.AnonymizerBot; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import org.telegram.telegrambots.ApiContextInitializer; import org.telegram.telegrambots.bots.DefaultBotOptions; import org.telegram.telegrambots.meta.ApiContext; import org.telegram.telegrambots.meta.TelegramBotsApi; import org.telegram.telegrambots.meta.exceptions.TelegramApiRequestException; public final class BotInitializer { private static final Logger LOG = LogManager.getLogger(BotInitializer.class); private static final String PROXY_HOST = "xx.xx.xxx.xxx"; private static final int PROXY_PORT = 9999; public static void main(String[] args) { try { LOG.info("Initializing API context..."); ApiContextInitializer.init(); TelegramBotsApi botsApi = new TelegramBotsApi(); LOG.info("Configuring bot options..."); DefaultBotOptions botOptions = ApiContext.getInstance(DefaultBotOptions.class); botOptions.setProxyHost(PROXY_HOST); botOptions.setProxyPort(PROXY_PORT); botOptions.setProxyType(DefaultBotOptions.ProxyType.SOCKS4); LOG.info("Registering Anonymizer..."); botsApi.registerBot(new AnonymizerBot(botOptions)); LOG.info("Anonymizer bot is ready for work!"); } catch (TelegramApiRequestException e) { LOG.error("Error while initializing bot!", e); } } } 

рд╡рд╣ рд╕рдм рд╣реИ! рдмреЙрдЯ рдкрд╣рд▓реЗ рдкрд░реАрдХреНрд╖рдгреЛрдВ рдХреЗ рд▓рд┐рдП рддреИрдпрд╛рд░ рд╣реИред


рдЙрджрд╛рд╣рд░рдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ


рдПрдХ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд░реВрдк рдореЗрдВ, рдЗрд╕ рдкрд░рд┐рджреГрд╢реНрдп рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВ:


  1. 'рдП' рдмреЙрдЯ ( /start ) рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдирд╛ /start ;
  2. 'рдП' рд╕рдВрджреЗрд╢ рднреЗрдЬрдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░ рд░рд╣рд╛ рд╣реИ;
  3. 'рдП' рдПрдХ рдирд╛рдо ( /set_name ) рд╕реЗрдЯ рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░ рд░рд╣рд╛ рд╣реИ;
  4. 'рдП' рдирд╛рдо рд╕реЗрдЯ ( /set_name Pendalf );
  5. 'рдП' рдЕрдиреНрдп рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЛ рд╕рдВрджреЗрд╢ рднреЗрдЬрддрд╛ рд╣реИ (рдЬреЛ рдирд╣реАрдВ рд╣реИрдВ);
  6. 'рдмреА' рдмреЙрдЯ ( /start ) рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдирд╛ /start ;
  7. 'рдмреА' рдирд╛рдо рд╕реЗрдЯ рдХрд░рддрд╛ рд╣реИ ( /set_name Chuck Norris );
  8. 'рдмреА' рдЕрдиреНрдп рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЛ рдПрдХ рд╕рдВрджреЗрд╢ рднреЗрдЬрддрд╛ рд╣реИ;
  9. 'A' рд╕рдВрджреЗрд╢ рдХреЛ 'B' рд╕реЗ рджреЗрдЦрддрд╛ рд╣реИ рдФрд░ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдореЗрдВ рд╕рдВрджреЗрд╢ рднреЗрдЬрддрд╛ рд╣реИ;
  10. 'B' 'A' рд╕реЗ рдЙрддреНрддрд░ рджреЗрдЦрддрд╛ рд╣реИ рдФрд░ рдЕрдм рдЙрд╕реЗ рдирд╣реАрдВ рд▓рд┐рдЦрддрд╛ рд╣реИ ...



Source: https://habr.com/ru/post/hi432548/


All Articles