Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 3 additions & 4 deletions pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -22,10 +22,9 @@
<version>6.5.0</version>
</dependency>
<dependency>
<!-- jsoup HTML parser library @ http://jsoup.org/ -->
<groupId>org.jsoup</groupId>
<artifactId>jsoup</artifactId>
<version>1.7.3</version>
<groupId>org.json</groupId>
<artifactId>json</artifactId>
<version>20230227</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
Expand Down
6 changes: 2 additions & 4 deletions src/main/java/net/dev4any1/tbot/App.java
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package net.dev4any1.tbot;

import java.util.Date;
import java.util.Scanner;

import org.slf4j.Logger;
Expand All @@ -12,7 +13,6 @@
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;

import net.dev4any1.tbot.dao.SubscriberRepository;
import net.dev4any1.tbot.service.BotService;

@Configuration
Expand All @@ -22,14 +22,12 @@ public class App implements CommandLineRunner {

private static final Logger log = LoggerFactory.getLogger(App.class);

@Autowired
SubscriberRepository repo;
@Autowired
BotService bs;

@Override
public void run(String... args) throws Exception {
log.info("starting tbot for " + repo.count() + " subscribers");
log.info("starting tbot at " + new Date());
bs.serviceDefault();
try (Scanner scan = new Scanner(System.in)) {
while (scan.hasNext()) {
Expand Down
78 changes: 36 additions & 42 deletions src/main/java/net/dev4any1/tbot/bot/Bot.java
Original file line number Diff line number Diff line change
@@ -1,75 +1,79 @@
package net.dev4any1.tbot.bot;

import java.util.*;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;

import net.dev4any1.tbot.dao.PollRepository;
import net.dev4any1.tbot.model.PollUpdate;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.telegram.telegrambots.bots.DefaultBotOptions;
import org.telegram.telegrambots.bots.TelegramLongPollingBot;
import org.telegram.telegrambots.meta.api.methods.polls.SendPoll;
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.polls.PollOption;
import org.telegram.telegrambots.meta.api.objects.polls.Poll;
import org.telegram.telegrambots.meta.api.objects.polls.PollAnswer;
import org.telegram.telegrambots.meta.exceptions.TelegramApiException;

import net.dev4any1.tbot.dao.PollRepository;
import net.dev4any1.tbot.dao.UpdateRepository;
import net.dev4any1.tbot.model.UpdateDoc;
import net.dev4any1.tbot.model.PollUpdateEntity;
import net.dev4any1.tbot.model.UpdateEntity;

public class Bot extends TelegramLongPollingBot {

private static final Logger log = LoggerFactory.getLogger(Bot.class);

private static final String BOT_WELCOME = "Привет! Я бот для опросов. Чтобы начать опрос, введите команду /poll.";
private static final String POLL_QUESTION = "Какие есть варианты?";
private static final String POLL_QUESTION_ANONYM = "Какие есть варианты анонимно?";
private static final List<String> POLL_OPTIONS = List.of("Я", "В костюме", "Без костюма");

private String botName;
private UpdateRepository upr;
private UpdateRepository updateRepository;
private PollRepository pollRepository;

public Bot(DefaultBotOptions options, String botToken, String name, UpdateRepository upr, PollRepository pollRepository) {
public Bot(DefaultBotOptions options, String botToken, String name, UpdateRepository updateRepository,
PollRepository pollRepository) {
super(options, botToken);
this.botName = name;
this.upr = upr;
this.updateRepository = updateRepository;
this.pollRepository = pollRepository;
}

@Override
public void onUpdateReceived(Update update) {
log.debug("update " + update.getClass() + " toStr: " + update.toString());

// saving any update
updateRepository.insert(new UpdateEntity(Helper.getJson(update).get()));
// saving non anonymous poll reply
if (update.hasPollAnswer()) {
pollRepository.save(new PollUpdate(update.getPollAnswer().getPollId(), update.getPollAnswer().toString()));
pollRepository.save(new PollUpdateEntity(update.getPollAnswer().getPollId(),
Helper.getJson(update.getPollAnswer()).get()));
}
// saving anonymous poll reply
if (update.hasPoll()) {
pollRepository.save(new PollUpdate(update.getPoll().getId(), update.getPoll().toString()));
pollRepository.save(new PollUpdateEntity(update.getPoll().getId(), Helper.getJson(update.getPoll()).get()));
}
// handling command
if (update.hasMessage() && update.getMessage().hasText()) {
String messageText = update.getMessage().getText();
String chatId = update.getMessage().getChatId().toString();
System.out.println("ChatID: "+chatId);
System.out.println("ChatID: " + chatId);

switch (messageText) {
case "/start":
sendTextMessage(chatId, "Привет! Я бот для опросов. Чтобы начать опрос, введите команду /poll.");
break;
case "/poll":
sendPoll(chatId, "Какие есть варианты?",
List.of("Я", "В костюме", "Без костюма"), false);
break;
case "/pollAnswer":
sendPoll(chatId, "Какие есть варианты анонимно?",
List.of("Я", "В костюме", "Без костюма"), true);
break;
case "/stat":
String statistic = pollRepository.findAll()
.stream()
.map(PollUpdate::getPoll)
case "/start":
sendTextMessage(chatId, BOT_WELCOME);
break;
case "/poll":
sendPoll(chatId, POLL_QUESTION, POLL_OPTIONS, false);
break;
case "/pollAnonym":
sendPoll(chatId, POLL_QUESTION_ANONYM, POLL_OPTIONS, true);
break;
case "/stats":
String statistic = pollRepository.findAll().stream().map(PollUpdateEntity::getPoll)
.collect(Collectors.joining(", "));
sendTextMessage(chatId, statistic);
break;
sendTextMessage(chatId, statistic);
break;
}
}
}
Expand Down Expand Up @@ -106,16 +110,6 @@ public Map<String, Integer> getPollResults() {
return null;
}

public String getGooAnswer(String query) {
Collection<SearchResult> searches = Helper.Searcher.search(query, 1);
if (!searches.isEmpty()) {
SearchResult sr = searches.iterator().next();
return "[" + sr.getTitle() + "](" + sr.getLink() + ")";
} else {
return "uh oh..";
}
}

@Override
public String getBotUsername() {
return botName;
Expand Down
63 changes: 11 additions & 52 deletions src/main/java/net/dev4any1/tbot/bot/Helper.java
Original file line number Diff line number Diff line change
@@ -1,61 +1,20 @@
package net.dev4any1.tbot.bot;

import java.net.URLEncoder;
import java.nio.charset.StandardCharsets;
import java.util.Collection;
import java.util.Collections;
import java.util.HashMap;
import java.util.Map;
import java.io.Serializable;
import java.util.Optional;

import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.json.JSONException;
import org.json.JSONObject;

public class Helper {

public static class Searcher {

private static final Logger log = LoggerFactory.getLogger(Searcher.class);

public static Collection<SearchResult> search(String query, int resultCount) {
try {
query = URLEncoder.encode(query, StandardCharsets.UTF_8.toString());
Document document = Jsoup.connect("http://www.google.com/search?q=" + query + "&num=" + resultCount)
.header("Accept-Language", "en-US,en;q=0.5")
.userAgent("Mozilla/5.0 (Windows NT 6.1; WOW64; rv:5.0) Gecko/20100101 Firefox/5.0").get();
return parseLinks(document);
} catch (Exception e) {
log.error("wtf jsoup: ", e);
return Collections.emptyList();
}
}

public static Collection<SearchResult> parseLinks(final Document doc) throws Exception {
Map<String, SearchResult> links = new HashMap<String, SearchResult>();
Element main = doc.getElementById("main");
Elements searchResults = main.select("div");
for (Element result : searchResults) {
String title = result.select("h3").text();
String link = normalizeLink(result.select("a").attr("href"));
String description = result.select("div").text();
if (!title.isEmpty() && !link.isEmpty() && !description.isEmpty() && !links.containsKey(link)) {
SearchResult serchResult = new SearchResult().withDescribtion(description).withLink(link)
.withTitle(title);
links.put(link, serchResult);
System.out.println(serchResult);
}
}
return links.values();
}

private static String normalizeLink(String link) {
if (!link.isEmpty()) {
link = (!link.startsWith("/url?q=http")) ? "" : link.substring(7, link.indexOf("&sa="));
}
return link;
public static Optional<String> getJson(Serializable entity) {
try {
return Optional.of(new JSONObject(entity).toString(1));
} catch (JSONException e) {
e.printStackTrace();
}
return Optional.empty();
}

}
72 changes: 0 additions & 72 deletions src/main/java/net/dev4any1/tbot/bot/SearchResult.java

This file was deleted.

12 changes: 5 additions & 7 deletions src/main/java/net/dev4any1/tbot/dao/PollRepository.java
100644 → 100755
Original file line number Diff line number Diff line change
@@ -1,13 +1,11 @@
package net.dev4any1.tbot.dao;

import net.dev4any1.tbot.model.PollUpdate;
import net.dev4any1.tbot.model.Subscriber;
import org.springframework.data.mongodb.repository.MongoRepository;

import java.util.List;

public interface PollRepository extends MongoRepository<PollUpdate, String> {
import org.springframework.data.mongodb.repository.MongoRepository;

import net.dev4any1.tbot.model.PollUpdateEntity;

public PollUpdate findByPollId(String pollId);
public List<PollUpdate> getAllByPollId(String pollId);
public interface PollRepository extends MongoRepository<PollUpdateEntity, String> {
public List<PollUpdateEntity> findByPollId(String pollId);
}
9 changes: 0 additions & 9 deletions src/main/java/net/dev4any1/tbot/dao/SubscriberRepository.java

This file was deleted.

5 changes: 2 additions & 3 deletions src/main/java/net/dev4any1/tbot/dao/UpdateRepository.java
Original file line number Diff line number Diff line change
@@ -1,10 +1,9 @@
package net.dev4any1.tbot.dao;

import net.dev4any1.tbot.model.PollUpdate;
import org.springframework.data.mongodb.repository.MongoRepository;

import net.dev4any1.tbot.model.UpdateDoc;
import net.dev4any1.tbot.model.UpdateEntity;

public interface UpdateRepository extends MongoRepository<PollUpdate, String> {
public interface UpdateRepository extends MongoRepository<UpdateEntity, String> {

}
Original file line number Diff line number Diff line change
Expand Up @@ -9,21 +9,21 @@
import java.io.Serializable;
import java.util.Objects;

public class PollUpdate implements Serializable {
private static final long serialVersionUID = PollUpdate.class.getName().hashCode();
public class PollUpdateEntity implements Serializable {
private static final long serialVersionUID = PollUpdateEntity.class.getName().hashCode();

@Id
@MongoId
private String id;

@Indexed(unique = true)
@Indexed(unique = false)
@Field(targetType = FieldType.STRING, write = Field.Write.NON_NULL)
private String pollId;

@Field(targetType = FieldType.STRING, write = Field.Write.NON_NULL)
private String poll;

public PollUpdate(String pollId, String poll) {
public PollUpdateEntity(String pollId, String poll) {
this.pollId = pollId;
this.poll = poll;
}
Expand Down Expand Up @@ -63,7 +63,7 @@ public boolean equals(Object obj) {
return false;
if (getClass() != obj.getClass())
return false;
PollUpdate other = (PollUpdate) obj;
PollUpdateEntity other = (PollUpdateEntity) obj;
return Objects.equals(id, other.id) && Objects.equals(poll, other.poll) && Objects.equals(pollId, other.pollId);
}

Expand Down
Loading