рдкреАрдПрдо рдореЗрдВ рдЕрдХреНрд╕рд░ рдкреВрдЫреЗ рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ рдкреНрд░рд╢реНрдиреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рд╣реИ рдореБрд╕реНрдХреБрд░рд╛рд╣рдЯ (рдЗрдореЛрдЬреАрд╕) рдФрд░ рд╕реНрдЯрд┐рдХрд░ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдирд╛ред
рдЙрдирдХреЗ рд╕рд╛рде рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рдирд╛ рд╣реИ, рдореИрдВ рдХреМрди рд╕реЗ рдЙрдкрдХрд░рдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реВрдВ, рдЖрджрд┐ред
рдЗрд╕ рднрд╛рдЧ рдореЗрдВ, рд╣рдо рдЗрд╕ рддрд░рд╣ рдХреА рдЪреАрдЬреЛрдВ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВрдЧреЗ: рд╕реНрдЯрд┐рдХрд░ рдХреЗ рд╕рд╛рде рдПрдХ рд╕рдВрджреЗрд╢ рдХреИрд╕реЗ рдмрдирд╛рдпрд╛ рдЬрд╛рдП, рд╕реНрдЯрд┐рдХрд░ рдХреЗ рд╕рд╛рде рдкреНрд░рд╛рдкреНрдд рд╕рдВрджреЗрд╢ рдХреЛ рдХреИрд╕реЗ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдП, рд╕рдВрджреЗрд╢ рдкрд╛рда рдореЗрдВ рд╕рднреА рдЗрдореЛрдЯрд┐рдХреЙрдиреНрд╕ (рдЗрдореЛрдЬреА) рдХреИрд╕реЗ рдЦреЛрдЬреЗрдВ, рдЗрдореЛрдЯрд┐рдХреЙрдиреНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдПрдХ рд╕рдВрджреЗрд╢ рдХреИрд╕реЗ рдмрдирд╛рдПрдВред
рдХреМрди рдкрд░рд╡рд╛рд╣ рдХрд░рддрд╛ рд╣реИ, рдХреГрдкрдпрд╛, рдмрд┐рд▓реНрд▓реА рдХреЗ рдиреАрдЪреЗред
рдкрд░рдВрдкрд░рд╛ рд╕реЗ, рд╣рдо рд▓реЗрдЦ рдХреЛ рдЗрд╕рдХреЗ рд╕реНрд░реЛрдд рдХреЗ рд▓рд┐рдВрдХ рдХреЗ рд╕рд╛рде рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВ :)
рд▓реЗрдЦ рдореЗрдВ рдЪрд░реНрдЪрд╛ рдХрд┐рдП рдЧрдП рд╕рднреА рдХреЛрдб рдХреЛ
Part3-Stick_and_Emoji рд╢рд╛рдЦрд╛ рдореЗрдВ рд╕рдВрдХрд▓рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред
рд╕реНрдЯрд┐рдХрд░
рдПрдХ рдЪреАрдЬ рдЬреЛ рдореБрдЭреЗ рдЯреЗрд▓реАрдЧреНрд░рд╛рдо рдореЗрдВ рдЗрддрдиреА рдкрд╕рдВрдж рдереА рдХрд┐ рдЬреИрд╕реЗ рд╣реА рд╡рд╣ рджрд┐рдЦрддреА рдереА рд╕реНрдЯрд┐рдХрд░ рдереЗред рд╡реЗ рд╢рд╛рдВрдд, рдЖрд░рд╛рдорджрд╛рдпрдХ, рдореБрдлреНрдд рд╣реИрдВред рдФрд░ рдпрд╣ рд╕рднреА рд╡рд┐рд╢рд╛рд▓ рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕реНрдЯрд┐рдХрд░ рд╣рдо рд╕реНрд╡рд╛рднрд╛рд╡рд┐рдХ рд░реВрдк рд╕реЗ рдмреЙрдЯ рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдпрд╣ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдмрд╣реБрдд рд╕рд░рд▓ рд╣реИред рдПрдХ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ рд╕реНрдЯрд┐рдХрд░ рднреЗрдЬрдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдореЗрдВ рдХреЗрд╡рд▓ рд╕реНрдЯрд┐рдХрд░ рдХреА рдЖрдИрдбреА рдЬрд╛рдирдирд╛ рд╣реЛрдЧрд╛ рдФрд░ рдХреБрдЫ рдирд╣реАрдВред
рдЖрдорддреМрд░ рдкрд░ рд╕реНрдЯрд┐рдХрд░ рдХреЗ рд▓рд┐рдП, рдореИрдВ рдЦреБрдж рдХреЛ рдПрдХ рдРрд╕рд╛ рд╕рд╣рд╛рдпрдХ рд╡рд░реНрдЧ рдмрдирд╛рддрд╛ рд╣реВрдВ, рдЬрд╣рд╛рдВ рдореИрдВ рдмреЙрдЯ рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ рд╕реНрдЯрд┐рдХрд░ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдбреЗрдЯрд╛ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рддрд╛ рд╣реВрдВ:
Stickers.javaimport org.telegram.telegrambots.api.methods.send.SendSticker; public enum Stickers { FUNNY_JIM_CARREY("CAADBQADiQMAAukKyAPZH7wCI2BwFxYE"), ; String stickerId; Stickers(String stickerId) { this.stickerId = stickerId; } public SendSticker getSendSticker(String chatId) { if ("".equals(chatId)) throw new IllegalArgumentException("ChatId cant be null"); SendSticker sendSticker = getSendSticker(); sendSticker.setChatId(chatId); return sendSticker; } public SendSticker getSendSticker() { SendSticker sendSticker = new SendSticker(); sendSticker.setSticker(stickerId); return sendSticker; } }
рдпрд╣рд╛рдВ рд╕рдм рдХреБрдЫ рд╕рд░рд▓ рд╣реИред рд╣рдо рд╕реНрдЯрд┐рдХрд░ рдХреЛ рдПрдХ рдирд╛рдо рджреЗрддреЗ рд╣реИрдВ рдЬреЛ рд╣рдорд╛рд░реЗ рд▓рд┐рдП рд╕рдордЭ рдореЗрдВ рдЖрддрд╛ рд╣реИред рдФрд░ рдХреБрдЫ рддрд░реАрдХреЛрдВ рдХреЗ рд╕рд╛рде, рд╣рдореЗрдВ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ рднреЗрдЬрдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рддреИрдпрд╛рд░ рд╡рд╕реНрддреБ рдорд┐рд▓рддреА рд╣реИред
рдкреНрд░рд╢реНрди рдХрд╛ рдЙрддреНрддрд░ рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП: "рдореИрдВ рд╕реНрдЯрд┐рдХрд░ рдЖрдИрдбреА рдХрд╣рд╛рдВ рд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВ?", - рдПрдХ рд╕рд╣рд╛рдпрдХ рд▓рд┐рдЦреЗрдВ рдЬреЛ рд╣рдореЗрдВ рд╣рдорд╛рд░реЗ рдмреЙрдЯ рдореЗрдВ рдпреЗ рдбреЗрдЯрд╛ рджреЗрдЧрд╛ред
рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рд╣рдорд╛рд░реЗ рджреНрд╡рд╛рд░рд╛ рдмрдирд╛рдИ рдЧрдИ рдореВрд▓ рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рд╣реИ:
TelegramBotред рдмреБрдирд┐рдпрд╛рджреА рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ред (рднрд╛рдЧ 2)рд╣рдорд╛рд░реЗ рдмреЙрдЯ рдХреЗ рд▓рд┐рдП рдХрд┐рд╕реА рднреА рддрд░рд╣ рд╕реЗ рд╕реНрд╡реАрдХреГрдд рд╕реНрдЯрд┐рдХрд░ рдХреЛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рдирд╛ рд╢реБрд░реВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдореЗрдВ рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ:
- рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░реЗрдВ рдХрд┐ рдЙрдиреНрд╣реЛрдВрдиреЗ рд╣рдореЗрдВ рдПрдХ рд╕реНрдЯрд┐рдХрд░ рднреЗрдЬрд╛
- рд╕рдВрдХреЗрдд рджреЗрдВ рдХрд┐ рд╕реНрдЯрд┐рдХрд░ рдХреЗ рд╕рд╛рде рд╕рдВрджреЗрд╢реЛрдВ рдХреЛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреМрди рд╕реЗ рд╣реИрдВрдбрд▓рд░ рдЬрд┐рдореНрдореЗрджрд╛рд░ рд╣реИрдВ
- рдПрдХ рд╣реИрдВрдбрд▓рд░ рдЪрд▓рд╛рдПрдВ рдЬреЛ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдореЗрдВ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рдВрджреЗрд╢ рдЙрддреНрдкрдиреНрди рдХрд░реЗрдЧрд╛
рдХрд╛рд░реНрдп : рдЬрдм рдЪреИрдЯ рдореЗрдВ рдПрдХ рд╕реНрдЯрд┐рдХрд░ рдкреНрд░рд╛рдкреНрдд рд╣реЛрддрд╛ рд╣реИ, рддреЛ рдмреЙрдЯ рдХреЛ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдореЗрдВ рд╕реНрдЯрд┐рдХрд░ рдЖрдИрдбреА рдХреЗ рд╕рд╛рде рдПрдХ рдкрд╛рда рд╕рдВрджреЗрд╢ рднреЗрдЬрдирд╛ рдЪрд╛рд╣рд┐рдПред
рд╣рдордиреЗ рдХрдорд╛рдВрдб рдХреА рд╕реВрдЪреА рдореЗрдВ
STICKER рдХрдорд╛рдВрдб рдХреЛ рдЬреЛрдбрд╝рд╛
рднреЗрдЬреЗ рдЧрдП рдЕрджреНрдпрддрди рдХреЗ рд╡рд┐рд╢реНрд▓реЗрд╖рдХ рдореЗрдВ, рд╣рдо рдпрд╣ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░реЗрдВрдЧреЗ рдХрд┐ рдХреНрдпрд╛ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдПрдХ рдкрд╛рда рд╕рдВрджреЗрд╢ рд╣реИ рдпрд╛ рдЗрд╕рдореЗрдВ рдПрдХ рд╕реНрдЯрд┐рдХрд░ рд╣реИ:
MessageReciever.java рд▓рд╛рдЗрди 57 if (message.hasText()) { parsedCommand = parser.getParsedCommand(message.getText()); } else { Sticker sticker = message.getSticker(); if (sticker != null) { parsedCommand = new ParsedCommand(Command.STICKER, sticker.getFileId()); } }
рдХреНрдпреЛрдВрдХрд┐ рд╣рдореЗрдВ рднреЗрдЬреЗ рдЧрдП рд╕рдВрджреЗрд╢ рдХреА рдЬрдЯрд┐рд▓ рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ, рдлрд┐рд░ рд╣рдо рддрдерд╛рдХрдерд┐рдд "рд╕рд┐рд╕реНрдЯрдо рд╕рдВрджреЗрд╢реЛрдВ" рдХреЛ рд╕рдВрднрд╛рд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдЬрд┐рдореНрдореЗрджрд╛рд░ рдореМрдЬреВрджрд╛ рд╣реИрдВрдбрд▓рд░ рдХреЛ рд╕реНрдЯрд┐рдХрд░ рд╡рд╛рд▓реЗ рд╕рдВрджреЗрд╢реЛрдВ рдХреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЛ рд╕реМрдВрдкреЗрдВрдЧреЗ:
MessageReciever.java рд▓рд╛рдЗрди 86 case START: case HELP: case ID: case STICKER: SystemHandler systemHandler = new SystemHandler(bot); log.info("Handler for command[" + command.toString() + "] is: " + systemHandler); return systemHandler;
рддрджрдиреБрд╕рд╛рд░,
SystemHandler рдореЗрдВ рд╣рдореЗрдВ рдпрд╣ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдХрд┐ рдкреНрд░рд╛рдкреНрдд
STICKER рдХрдорд╛рдВрдб рдХреЛ рдХреИрд╕реЗ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдП:
SystemHandler.java рд▓рд╛рдЗрди 31 case STICKER: return "StickerID: " + parsedCommand.getText();
рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк, рд╣рдорд╛рд░реЗ рдмреЙрдЯ рдореЗрдВ рдХреЛрдИ рднреА рд╕реНрдЯрд┐рдХрд░ рднреЗрдЬрддреЗ рд╕рдордп, рд╣рдо рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдореЗрдВ рдЗрд╕рдХреА рдЖрдИрдбреА рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВрдЧреЗ:

рдЗрдореЛрдЯрд┐рдХреЙрди рдпрд╛ рдЗрдореЛрдЬреА
рд╡реЗ рдорд╛рдирдХреАрдХреГрдд рдереЗ, рд▓рдЧрднрдЧ рд╕рднреА рдЙрдкрдХрд░рдг рдФрд░ рдСрдкрд░реЗрдЯрд┐рдВрдЧ рд╕рд┐рд╕реНрдЯрдо рд╕рдордЭрддреЗ рд╣реИрдВ рдФрд░ рдЙрдиреНрд╣реЗрдВ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реИрдВред рд╡реЗ рд╕рдВрджреЗрд╢реЛрдВ рдХреЛ рд╕рдЬрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╣реИрдВред рд╡реЗ рд╕рдВрджреЗрд╢реЛрдВ рдХреЗ рдиреАрдЪреЗ рдмрдЯрди рдкрд░ рд░рд╕реАрд▓реЗ рд░реВрдк рдореЗрдВ рджрд┐рдЦрддреЗ рд╣реИрдВред рдпрд╣ рдкрд╕рдВрдж рд╣реИ рдпрд╛ рдирд╣реАрдВ - рдХреБрдЫ рдлрд╛рдпрджреЗред
рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП,
рдИрд╡реЗрдВрдЯ рд╢реЗрдбреНрдпреВрд▓рд░ рдмреЙрдЯ рдореЗрдВ
рдмрдЯрди рдкрд░ рдФрд░ рд╕рдВрджреЗрд╢ рдХреЗ рдкрд╛рда рдореЗрдВ рдПрдХ рд╣реА рдЖрдЗрдХрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛, рдЖрдк рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ рд╕рд╣рдЬрддрд╛ рд╕реЗ рдФрд░ рдЕрдкрдиреЗ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЛ рд╕рдордЭрдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддреЗ рд╣реИрдВ, рд╕рдВрджреЗрд╢ рдФрд░ рдмрдЯрди рдХреЛ рдЕрддрд┐рд░рд┐рдХреНрдд рдкрд╛рда рдХреЗ рд╕рд╛рде рдЕрд╡реНрдпрд╡рд╕реНрдерд┐рдд рдХрд░рддреЗ рд╣реИрдВред
рдПрдХ рд╕рдВрджреЗрд╢ рдпрд╛ рдПрдХ рдмрдЯрди рдореЗрдВ рдЗрдореЛрдЬреАрд╕ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдЗрд╕рдХреЗ рдпреВрдирд┐рдХреЛрдб рдХреЛ рдЬрд╛рдирдирд╛ рд╣реЛрдЧрд╛ред рдЗрдВрдЯрд░рдиреЗрдЯ рдЙрди рд╕реНрд░реЛрддреЛрдВ рд╕реЗ рднрд░рд╛ рд╣реИ рдЬрд╣рд╛рдВ рдЖрдк рд╕рднреА рд╕реВрдЪреАрдмрджреНрдз рдЗрдореЛрдЯрд┐рдХреЙрдиреНрд╕ рдкрд╛ рд╕рдХрддреЗ рд╣реИрдВ, рдЬрд╣рд╛рдВ рдЙрдирдХреЗ рдЯреИрдЧ, рдХреЛрдб рдЗрдВрдЧрд┐рдд рдХрд┐рдП рдЧрдП рд╣реИрдВред
рдЕрдкрдиреЗ рд▓рд┐рдП, рдореИрдВрдиреЗ рдЗрдореЛрдЬреАрд╕ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХрд╛ рдпрд╣ рддрд░реАрдХрд╛ рдЪреБрдирд╛: рдЯреЗрд▓реАрдЧреНрд░рд╛рдо рдореЗрдВ рдЗрдореЛрдЯрд┐рдХреЙрдиреНрд╕ рдХреЛ рджреЗрдЦрдирд╛ рдФрд░ рдЪрдпрди рдХрд░рдирд╛ рдЕрдзрд┐рдХ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╣реИред
рдареАрдХ рд╣реИ, рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ, рд╕реНрдЯрд┐рдХрд░ рдХреЗ рд╕рд╛рде рд╕рд╛рджреГрд╢реНрдп рджреНрд╡рд╛рд░рд╛, рдЖрдЗрдП рдЕрдкрдиреЗ рд▓рд┐рдП рдереЛрдбрд╝рд╛ рд╕рд╣рд╛рдпрдХ рд▓рд┐рдЦреЗрдВ рдЬреЛ рд╣рдореЗрдВ рдЖрд╡рд╢реНрдпрдХ рдХреЛрдб рджрд┐рдЦрд╛рдПрдЧрд╛ рдФрд░ рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рд╣рдореЗрдВ рдЙрдиреНрд╣реЗрдВ рд╕рд╣реА рдврдВрдЧ рд╕реЗ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рдиреЗ рдХреА рдЧрд╛рд░рдВрдЯреА рд╣реИред
рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдирд┐рд░реНрднрд░рддрд╛
pom.xml рдореЗрдВ рдЬреЛрдбрд╝реЗрдВ:
<dependency> <groupId>com.vdurmont</groupId> <artifactId>emoji-java</artifactId> <version>3.3.0</version> </dependency>
рдИрдорд╛рдирджрд╛рд░реА рд╕реЗ, рдореБрдЭреЗ рдпрд╛рдж рдирд╣реАрдВ рд╣реИ рдХрд┐ рдореИрдВ рдЗрд╕рдХреЗ рдкрд╛рд░ рдХрд╣рд╛рдБ рдЖрдпрд╛ рдерд╛, рд▓реЗрдХрд┐рди рддрдм рд╕реЗ рдореИрдВ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХреЗрд╡рд▓ рддрднреА рдХрд░рддрд╛ рд╣реВрдБ рдЬрдм рдореБрдЭреЗ рдЕрдкрдиреЗ рдмреЙрдЯ рдореЗрдВ рдЗрдореЛрдЯрд┐рдХреЙрдиреНрд╕ рдХреЗ рд╕рд╛рде рдХреБрдЫ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред
рдкреБрд╕реНрддрдХрд╛рд▓рдп рдореЗрдВ рдХрдИ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдЙрдкрдХрд░рдг рд╣реИрдВ:

рдЬрд┐рдЬреНрдЮрд╛рд╕реБ рдФрд░ рдЬрд┐рдЬреНрдЮрд╛рд╕реБ рд╡рд╣ рд╣реЛрдЧрд╛ рдЬрд╣рд╛рдБ рдШреВрдордирд╛ рд╣реИ :)
рдмреЙрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЗрдореЛрдЯрд┐рдХреЙрди рднреЗрдЬрдиреЗ рдореЗрдВ рдХреНрдпрд╛ рд▓рдЧрддрд╛ рд╣реИ? рдЖрдкрдХреЛ рдпреВрдирд┐рдХреЛрдб рд╕рдВрджреЗрд╢ рдХреЗ рдкрд╛рда рдореЗрдВ рд╡рд╛рдВрдЫрд┐рдд рдЗрдореЛрдЬреА рдХреЛ рдПрдореНрдмреЗрдб рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред
рд╣рд╛рдВ, рдЖрдк рдЙрди рд╕рдВрд╕рд╛рдзрдиреЛрдВ рдХреЛ рдкрд╛ рд╕рдХрддреЗ рд╣реИрдВ рдЬреЛ рдЗрдореЛрдЬреАрд╕ рдХреЗ рд╕рд╛рде рдпреВрдирд┐рдХреЛрдб рд╕реВрдЪрд┐рдпрд╛рдБ рджреЗрддреЗ рд╣реИрдВ, рдЕрд▓рдЧ-рдЕрд▓рдЧ рд╕рд╛рд░рд╛рдВрд╢ рддрд╛рд▓рд┐рдХрд╛рдПрдБ рджрд┐рдЦрд╛рддреЗ рд╣реИрдВ рдХрд┐ рдЗрдореЛрдЯрд┐рдХреЙрдиреНрд╕ рдЕрд▓рдЧ-рдЕрд▓рдЧ рд╕реНрдорд╛рд░реНрдЯрдлрд╝реЛрди рдкрд░ рдХреИрд╕реЗ рджрд┐рдЦрддреЗ рд╣реИрдВред
рдореИрдВ рдЖрдкрдХреЛ рдПрдХ рд░рд╛рд╕реНрддрд╛ рджрд┐рдЦрд╛рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рдЬреЛ рдореЗрд░реЗ рд▓рд┐рдП рдореБрд╕реНрдХреБрд░рд╛рд╣рдЯ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдмрд╕реЗ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рдирд┐рдХрд▓рд╛ред
рдкрд╣рд▓реЗ, рдЖрдЗрдП рджреЗрдЦреЗрдВ рдХрд┐ рдЖрдк рдЯреЗрд▓реАрдЧреНрд░рд╛рдо рдореЗрдВ рдореБрд╕реНрдХреБрд░рд╛рд╣рдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХреИрд╕реЗ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдЖрдк рдПрдХ рдбрд╛рдпрд▓реЙрдЧ рдмреЙрдХреНрд╕ рдкрд░ рдХреЙрд▓ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдЬрд╣рд╛рдВ рд╕рднреА рдЗрдореЛрдЯрд┐рдХреЙрдиреНрд╕ рд╕реВрдЪреАрдмрджреНрдз рд╣реИрдВ рдФрд░ рдЙрдиреНрд╣реЗрдВ рдХреЗрд╡рд▓ рдЕрдкрдиреЗ рдЖрдЗрдХреЙрди рдкрд░ рдХреНрд▓рд┐рдХ рдХрд░рдХреЗ рд╕рдВрджреЗрд╢ рдореЗрдВ рдЬреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВред рдЯреИрдЧ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╕рдВрджреЗрд╢ рдореЗрдВ рдЗрдореЛрдЯрд┐рдХреЙрдиреНрд╕ рднреА рдЬреЛрдбрд╝рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
рдЯреИрдЧ рдХреЛ рдХреЙрд▓рди рдореЗрдВ рдлрдВрд╕рд╛рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП рдФрд░ рдХреБрдЫ рдкреНрд░рдХрд╛рд░ рдХреЗ рдЕрдиреВрдареЗ рдкрд╛рда рд╣реЛрддреЗ рд╣реИрдВ рдЬреЛ рд╡рд╛рдВрдЫрд┐рдд рд╕реНрдорд╛рдЗрд▓реА рдХрд╛ рд╕рдВрдХреЗрдд рджреЗрддреЗ рд╣реИрдВред
рдпрджрд┐ рдХрд┐рд╕реА рд╕рдВрджреЗрд╢ рдХреЛ рджрд░реНрдЬ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреНрд╖реЗрддреНрд░ рдореЗрдВ рдЖрдк рдПрдХ рдХреЙрд▓рди рдХреЗ рд╕рд╛рде рд╢реБрд░реВ рд╣реЛрдиреЗ рд╡рд╛рд▓реЗ рд╕рдВрджреЗрд╢ рдХреЛ рдЯрд╛рдЗрдк рдХрд░рдирд╛ рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдЯреЗрд▓реАрдЧреНрд░рд╛рдо рд╕реНрд╡рдпрдВ рджрд┐рдЦрд╛рдирд╛ рд╢реБрд░реВ рдХрд░ рджреЗрдЧрд╛ рдХрд┐ рдХреМрди рд╕реЗ рдЗрдореЛрдЬреА рдореЗрдВ рдЯреИрдЧ рдХрд╛ рджрд░реНрдЬ рдкрд╛рда рд╣реИ:

рдФрд░ рдЬрдм рдЖрдк рд╕рд╣реА рдЗрдореЛрдЯрд┐рдХреЙрди рдЯреИрдЧ рджрд░реНрдЬ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдПрдХ рдФрд░ рдмреГрд╣рджрд╛рдиреНрддреНрд░ рдбрд╛рд▓рддреЗ рд╣реИрдВ - рдкрд╛рда рдПрдХ рд╕реНрдорд╛рдЗрд▓реА рдореЗрдВ рдмрджрд▓ рдЬрд╛рдПрдЧрд╛ред рдпрджрд┐ рдЖрдк рдмрд╛рдИрдВ рдорд╛рдЙрд╕ рдмрдЯрди рдХреЛ рдЗрдореЛрдЯрд┐рдХреЙрди рдкрд░ рд░рдЦрддреЗ рд╣реИрдВ рддреЛ рдЯреИрдЧ рднреА рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВред

рдФрд░ рдЕрдм рдкреБрд╕реНрддрдХрд╛рд▓рдп рд╣рдорд╛рд░реА рд╕рд╣рд╛рдпрддрд╛ рдХреЗ рд▓рд┐рдП рдЖрддрд╛ рд╣реИ, рдЬрд┐рд╕рдХреА рдирд┐рд░реНрднрд░рддрд╛ рд╣рдордиреЗ рдКрдкрд░ рдЬреЛрдбрд╝ рджреА рд╣реИред рд╡рд╣ рдЗрдореЛрдЯрд┐рдХреЙрди рдЯреИрдЧ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдирд╛ рдЬрд╛рдирддреА рд╣реИред рдпрд╣ рдЖрдкрдХреЗ рд▓рд┐рдП рдореБрдЦреНрдп рд░реВрдк рд╕реЗ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдЯреИрдЧ рдЕрдзрд┐рдХ рдкрдардиреАрдп рд╣реИрдВ, рд╡реЗ рдХрд┐рд╕реА рдкреНрд░рдХрд╛рд░ рдХрд╛ рдЕрд░реНрде рд░рдЦрддреЗ рд╣реИрдВред
рдФрд░ рд╣рдо, рдЯреИрдЧ рдХреЛ рдЬрд╛рдирддреЗ рд╣реБрдП, рдЗрд╕ рддрд░рд╣ рд╕реЗ рдпреВрдирд┐рдХреЛрдб рдЗрдореЛрдЯрд┐рдХреЙрди рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:
String emoji_kissing = EmojiParser.parseToUnicode(":kissing:");
рдЖрдк рдЕрдкрдиреЗ рдЖрдк рдХреЛ рдПрдХ рдЕрд▓рдЧ рд╡рд░реНрдЧ рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВ рдЬрд┐рд╕рдореЗрдВ рдЖрдк рдмреЙрдЯрдо рдореЗрдВ рдЙрдкрдпреЛрдЧ рд╣реЛрдиреЗ рд╡рд╛рд▓реЗ рдЗрдореЛрдЯрд┐рдХреЙрдиреНрд╕ рдХреЛ рд░рдЦреЗрдВрдЧреЗред рдЙрд╕реА
рдШрдЯрдирд╛ рдХреЗ рдпреЛрдЬрдирд╛рдХрд╛рд░ рдХреЗ рдЙрджрд╛рд╣рд░рдг рдкрд░, рдЙрдиреНрд╣реЛрдВрдиреЗ рдЕрдкрдиреЗ рд╢рд╕реНрддреНрд░рд╛рдЧрд╛рд░ рдореЗрдВ рдпреЗ рдореБрд╕реНрдХреБрд░рд╛рд╣рдЯ рджреА рд╣реИ:
import com.vdurmont.emoji.EmojiParser; public enum Icon { PLUS(":heavy_plus_sign:"), MINUS(":heavy_minus_sign:"), CHECK(":white_check_mark:"), NOT(":x:"), DOUBT(":zzz:"), FLAG(":checkered_flag:") private String value; public String get() { return EmojiParser.parseToUnicode(value); } Icon(String value) { this.value = value; } }
рдФрд░ рдЗрд╕ рддрд░рд╣ рдпрд╣ рдХреЛрдб рдЗрд╕ рд╡рд░реНрдЧ рдФрд░ рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдЗрдореЛрдЯрд┐рдХреЙрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП рджрд┐рдЦреЗрдЧрд╛:
row.add(new InlineKeyboardButton() .setText(Icon.CHECK.get() + " I'm going")
рдпрд╣ рдЗрд╕ рдмрдЯрди рдХрд╛ рдХреЛрдб рд╣реИ:

рдореИрдВрдиреЗ рдЗрд╕ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХреА рдПрдХ рдмрд╛рд░реАрдХрд┐рдпреЛрдВ рдкрд░ рдзреНрдпрд╛рди рджрд┐рдпрд╛ред рд╕рднреА рдЗрдореЛрдЯрд┐рдХреЙрдиреНрд╕ рдЬреЛ рдЯреЗрд▓реАрдЧреНрд░рд╛рдо рдореЗрдВ рдирд╣реАрдВ рд╣реИрдВ, рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдкрд╣рдЪрд╛рди рд╕рдХрддреА рд╣реИред рдЗрд╕рд▓рд┐рдП, рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХреЗ рдирдП рд╕рдВрд╕реНрдХрд░рдгреЛрдВ рдХреЗ рд▓рд┐рдП рджреЗрдЦреЗрдВред
рдареАрдХ рд╣реИ, рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐ рдХреМрди рд╕реА рдореБрд╕реНрдХреБрд░рд╛рд╣рдЯ рд╣рдо рджрд┐рдЦрд╛ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдХреМрди рд╕реА рдирд╣реАрдВ, рд╣рдо рдЗрд╕ рдХрд╛рд░реНрдп рдХреЛ рдЕрдкрдиреЗ рд╕рд╣рд╛рдпрдХ рдХреЛ рд╕реМрдВрдк рджреЗрдВрдЧреЗред
рдЯрд╛рд╕реНрдХ: рдпрджрд┐ рднреЗрдЬреЗ рдЧрдП рд╕рдВрджреЗрд╢ рдореЗрдВ рдХреЛрдИ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдХрдорд╛рдВрдб рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдкрд╛рда рдореЗрдВ рдЗрдореЛрдЯрд┐рдХреЙрдиреНрд╕ рд╢рд╛рдорд┐рд▓ рд╣реИрдВ - рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ рд╕рдВрджреЗрд╢ рдХреЗ рд░реВрдк рдореЗрдВ рд╕реНрдХреНрд░реАрди рдкрд░ рдЗрди рдЗрдореЛрдЯрд┐рдХреЙрдиреНрд╕ рдХреЛ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░реЗрдВ рдФрд░ рдЙрдирдХреА рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ (рдЯреИрдЧ рдФрд░ рд╡рд┐рд╡рд░рдг) рдХрд╛ рд╕рдВрдХреЗрдд рджреЗрдВред
рдХрдорд╛рдВрдб рдХреА рд╕реВрдЪреА рдореЗрдВ
TEXT_CONTAIN_EMOJI рдХрдорд╛рдВрдб рдЬреЛрдбрд╝реЗрдВ
рдХрдорд╛рдВрдб.рдЬрд╡рд╛ рд▓рд╛рдЗрди 8 public enum Command { ... TEXT_CONTAIN_EMOJI, ... }
рдЙрд╕ рдкрд╛рд░реНрд╕рд░ рдореЗрдВ рдЬреЛ рдпрд╣ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рддрд╛ рд╣реИ рдХрд┐ рд╣рдорд╛рд░реЗ рд╕рдВрджреЗрд╢ рдореЗрдВ рдХрд┐рд╕ рддрд░рд╣ рдХреА рдХрдорд╛рдВрдб рдирд┐рд╣рд┐рдд рд╣реИ, рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдкрд╛рда рдЬреЛрдбрд╝реЗрдВ:
Parser.java рд▓рд╛рдЗрди 38 if (result.getCommand() == Command.NONE) { List<String> emojiContainsInText = EmojiParser.extractEmojis(result.getText()); if (emojiContainsInText.size() > 0) result.setCommand(Command.TEXT_CONTAIN_EMOJI); }
рдпрджрд┐ рд╣рдо рдпрд╣ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рддреЗ рд╣реИрдВ рдХрд┐ рд╕рдВрджреЗрд╢ рдореЗрдВ рдХреЛрдИ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдХрдорд╛рдВрдб рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдЗрд╕рдореЗрдВ рдЗрдореЛрдЯрд┐рдХреЙрдиреНрд╕ рд╣реИрдВ, рддреЛ рд╣рдо рд╡рд╛рдкрд╕ рд▓реМрдЯрддреЗ рд╣реИрдВ рдХрд┐ рд╣рдордиреЗ TEXT_CONTAIN_EMOJI рдХрдорд╛рдВрдб рдХреЛ рдкрд╛рд░реНрд╕ рдХрд┐рдпрд╛ред
рдПрдХ рдЕрд▓рдЧ рд╣реИрдВрдбрд▓рд░ рдмрдирд╛рдПрдВ рдЬреЛ рдХреЗрд╡рд▓ рдЗрд╕ рдХрдорд╛рдВрдб рдХреЛ рдкреНрд░реЛрд╕реЗрд╕ рдХрд░реЗрдЧрд╛:
EmojiHandler.java import com.example.telegrambot.bot.Bot; import com.example.telegrambot.command.ParsedCommand; import com.vdurmont.emoji.Emoji; import com.vdurmont.emoji.EmojiManager; import com.vdurmont.emoji.EmojiParser; import org.apache.log4j.Logger; import org.telegram.telegrambots.api.objects.Update; import java.util.HashSet; import java.util.Set; public class EmojiHandler extends AbstractHandler { private static final Logger log = Logger.getLogger(EmojiHandler.class); public EmojiHandler(Bot bot) { super(bot); } @Override public String operate(String chatId, ParsedCommand parsedCommand, Update update) { String text = parsedCommand.getText(); StringBuilder result = new StringBuilder(); Set<String> emojisInTextUnique = new HashSet<>(EmojiParser.extractEmojis(text)); if (emojisInTextUnique.size() > 0) result.append("Parsed emojies from message:").append("\n"); for (String emojiUnicode : emojisInTextUnique) { Emoji byUnicode = EmojiManager.getByUnicode(emojiUnicode); log.debug(byUnicode.toString()); String emoji = byUnicode.getUnicode() + " " + byUnicode.getAliases() + " " + byUnicode.getDescription(); result.append(emoji).append("\n"); } return result.toString(); } }
рдпрд╣ рдХреЛрдб рдХреЗрд╡рд▓ рд╕рдВрджреЗрд╢ рдкрд╛рда рд╕реЗ рдЗрдореЛрдЯрд┐рдХреЙрдиреНрд╕ рдХрд╛ рдЪрдпрди рдХрд░рддрд╛ рд╣реИ, рдЕрджреНрд╡рд┐рддреАрдп рд▓реЛрдЧреЛрдВ рдХреЗ рд╕рд╛рде рдПрдХ рд╕реЗрдЯ рдмрдирд╛рддрд╛ рд╣реИ, рдЙрдирдХреЗ рдЧреБрдгреЛрдВ рд╕реЗ рдЯреИрдЧ рдФрд░ рд╡рд┐рд╡рд░рдг рдХрд╛ рдЪрдпрди рдХрд░рддрд╛ рд╣реИ, рдФрд░ рдЗрд╕рд╕реЗ рдПрдХ рдкрд╛рда рд╕рдВрджреЗрд╢ рдЙрддреНрдкрдиреНрди рдХрд░рддрд╛ рд╣реИред
рдХрд╛рдо рдХрд╛ рдкрд░рд┐рдгрд╛рдо рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрддрд╛ рд╣реИ:

рд╡рд░реНрдЧ рдХреЛрд╖реНрдардХ рдореЗрдВ рд╣рдореЗрдВ рд╡реЗ рдЯреИрдЧ рдорд┐рд▓рддреЗ рд╣реИрдВ рдЬрд┐рдирдХрд╛ рдЙрдкрдпреЛрдЧ рд╣рдо рдЗрдореЛрдЯрд┐рдХреЙрдиреНрд╕ рд╕рдореНрдорд┐рд▓рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ 1 рд╕реЗ рдЕрдзрд┐рдХ рдЯреИрдЧ рдХрднреА-рдХрднреА рдПрдХ рдЗрдореЛрдЯрд┐рдХреЙрди рдХреЛ рд╕рдВрджрд░реНрднрд┐рдд рдХрд░рддреЗ рд╣реИрдВред
рдФрд░ рдЗрд╕ рд╕рд╣рд╛рдпрдХ рдХреА рдорджрдж рд╕реЗ, рд╣рдо рдареАрдХ рд╕реЗ рд╕рдордЭ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рд╣рдорд╛рд░реА рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХреМрди рд╕реЗ рдЗрдореЛрдЯрд┐рдХреЙрдиреНрд╕ рдХреЛ рд╕рдордЭрддреА рд╣реИ рдФрд░ рдХреМрди рд╕реЗ рдЗрд╕реЗ рдЕрдирджреЗрдЦрд╛ рдХрд░рддрд╛ рд╣реИред
рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЖрдк рдпрд╣рд╛рдВ рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ:

рдХреЛрдб рдХреЗ рд╕рд╛рде рдореБрд╕реНрдХреБрд░рд╛рдПрдВ
: face_with_monocle: рдХрд┐рд╕реА рдХрд╛рд░рдг рд╕реЗ рдЗрд╕ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рджреНрд╡рд╛рд░рд╛ рдЗрд╕рдХрд╛ рдкрддрд╛ рдирд╣реАрдВ рд▓рдЧрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИред
рддреЛ, рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдПрдХ рд╣реИрдВрдбрд▓рд░ рд╣реИред рд╣рдо рдЙрд╕реЗ рдХреИрд╕реЗ рдХрд╛рд░реНрдп рдкрд╛рд╕ рдХрд░рддреЗ рд╣реИрдВ?
рдХреНрдпреЛрдВрдХрд┐ рд╣рдо рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЬрд╛рдирддреЗ рд╣реИрдВ рдХрд┐ рдЗрдореЛрдЯрд┐рдХреЙрдиреНрд╕ рдХреЗ рд╕рд╛рде рдПрдХ рдкрд╛рда рд╕рдВрджреЗрд╢ рдХреЛ TEXT_CONTAIN_EMOJI рдХрдорд╛рдВрдб рдХреЗ рд░реВрдк рдореЗрдВ рдкрд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ - MessageReciever рдореЗрдВ рд╣рдореЗрдВ рдпрд╣ рдЗрдВрдЧрд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдХрд┐ рдЗрд╕ рдХрдорд╛рдВрдб рдХреЛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрд▓рдЧ рдЗрдореЛрдЬреАрд╣реИрдВрдбрд▓рд░ рд╣реИрдВрдбрд▓рд░ рдЬрд┐рдореНрдореЗрджрд╛рд░ рд╣реИред
MessageReciever.java рд▓рд╛рдЗрди 94 case TEXT_CONTAIN_EMOJI: EmojiHandler emojiHandler = new EmojiHandler(bot); log.info("Handler for command[" + command.toString() + "] is: " + emojiHandler); return emojiHandler;
рдЦреБрд╢реА рдореЗрдВ рдХрд╛рд░реНрдпрдХреНрд░рдо рдФрд░ рд╕рд╡рд╛рд▓ рдкреВрдЫрдиреЗ рдореЗрдВ рд╕рдВрдХреЛрдЪ рдирд╣реАрдВ рдХрд░рддреЗ :)
рдкреБрдирд╢реНрдЪ
рдЖрдк рдЗрд╕ рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХреЗ рд╕рд╛рде рдмреЙрдЯ рдХреЛ рдорд╣рд╕реВрд╕ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:
https://t.me/test_habr_bot ред