Explorar o código

учёт сообщений

kpmy %!s(int64=8) %!d(string=hai) anos
pai
achega
3f60e10ebc

+ 8 - 0
pom.xml

@@ -8,9 +8,11 @@
     <artifactId>these-days</artifactId>
     <version>0.0.1</version>
     <packaging>war</packaging>
+
     <properties>
         <java.version>1.8</java.version>
     </properties>
+
     <parent>
         <groupId>org.springframework.boot</groupId>
         <artifactId>spring-boot-starter-parent</artifactId>
@@ -45,6 +47,12 @@
             <version>2.3.1.1</version>
         </dependency>
 
+        <dependency>
+            <groupId>org.mapdb</groupId>
+            <artifactId>mapdb</artifactId>
+            <version>3.0.3</version>
+        </dependency>
+
     </dependencies>
 
     <build>

+ 24 - 0
src/main/java/in/ocsf/these/days/app/KV.java

@@ -0,0 +1,24 @@
+package in.ocsf.these.days.app;/* kpmy 19.02.2017 */
+
+import org.mapdb.DB;
+import org.mapdb.DBMaker;
+import org.springframework.stereotype.Service;
+
+import java.util.Map;
+import java.util.Optional;
+
+@Service
+public class KV {
+
+    private static final DB db = DBMaker.memoryDB().make();
+
+    public Long getSelfUser() {
+        Map map = db.hashMap("bot").createOrOpen();
+        return Optional.ofNullable(map.get("self")).map(u -> (Long) u).orElseThrow(RuntimeException::new);
+    }
+
+    public void setSelfUser(Long u) {
+        Map map = db.hashMap("bot").createOrOpen();
+        map.put("self", u);
+    }
+}

+ 35 - 2
src/main/java/in/ocsf/these/days/app/listener/ChatListener.java

@@ -4,10 +4,16 @@ import com.pengrad.telegrambot.Callback;
 import com.pengrad.telegrambot.TelegramBot;
 import com.pengrad.telegrambot.TelegramBotAdapter;
 import com.pengrad.telegrambot.model.Update;
+import com.pengrad.telegrambot.request.GetMe;
 import com.pengrad.telegrambot.request.GetUpdates;
+import com.pengrad.telegrambot.response.GetMeResponse;
 import com.pengrad.telegrambot.response.GetUpdatesResponse;
+import in.ocsf.these.days.app.KV;
 import in.ocsf.these.days.app.object.UpdateState;
+import in.ocsf.these.days.app.object.User;
 import in.ocsf.these.days.app.repo.UpdateStateRepository;
+import in.ocsf.these.days.app.repo.UserRepository;
+import in.ocsf.these.days.app.service.UpdateService;
 import org.apache.log4j.Logger;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Value;
@@ -15,6 +21,7 @@ import org.springframework.scheduling.annotation.Async;
 import org.springframework.scheduling.annotation.Scheduled;
 import org.springframework.stereotype.Service;
 
+import javax.annotation.PostConstruct;
 import java.io.IOException;
 import java.util.Optional;
 
@@ -26,15 +33,41 @@ public class ChatListener {
     @Value("${these-days.bot.token}")
     private String token;
 
+    @Autowired
+    private KV kv;
+
     @Autowired
     private UpdateStateRepository stateRepo;
 
+    @Autowired
+    private UpdateService updateService;
+
+    @Autowired
+    private UserRepository userRepo;
+
     @Async
     protected void update(Update update) {
-        log.info(update.updateId());
+        updateService.update(update);
+    }
+
+    @PostConstruct
+    protected void init() {
+        TelegramBot bot = TelegramBotAdapter.build(token);
+        bot.execute(new GetMe(), new Callback<GetMe, GetMeResponse>() {
+            @Override
+            public void onResponse(GetMe request, GetMeResponse response) {
+                User self = userRepo.save(User.fromUser(response.user()));
+                kv.setSelfUser(self.getId());
+            }
+
+            @Override
+            public void onFailure(GetMe request, IOException e) {
+                e.printStackTrace();
+            }
+        });
     }
 
-    @Scheduled(fixedDelay = 500)
+    @Scheduled(fixedDelay = 1000)
     protected void doRequest() {
         TelegramBot bot = TelegramBotAdapter.build(token);
 

+ 29 - 0
src/main/java/in/ocsf/these/days/app/object/Message.java

@@ -0,0 +1,29 @@
+package in.ocsf.these.days.app.object;/* kpmy 19.02.2017 */
+
+import org.springframework.data.annotation.Id;
+import org.springframework.data.mongodb.core.mapping.Document;
+
+@Document(collection = "message")
+public class Message {
+
+    @Id
+    private Long id;
+
+    private User sender;
+
+    public Long getId() {
+        return id;
+    }
+
+    public void setId(Long id) {
+        this.id = id;
+    }
+
+    public User getSender() {
+        return sender;
+    }
+
+    public void setSender(User sender) {
+        this.sender = sender;
+    }
+}

+ 58 - 0
src/main/java/in/ocsf/these/days/app/object/User.java

@@ -0,0 +1,58 @@
+package in.ocsf.these.days.app.object;/* kpmy 19.02.2017 */
+
+import org.springframework.data.annotation.Id;
+import org.springframework.data.mongodb.core.mapping.Document;
+
+@Document(collection = "user")
+public class User {
+
+    @Id
+    private Long id;
+
+    private String firstName;
+
+    private String lastName;
+
+    private String userName;
+
+    public static User fromUser(com.pengrad.telegrambot.model.User u) {
+        User ret = new User();
+        ret.id = Long.valueOf(u.id());
+        ret.firstName = u.firstName();
+        ret.lastName = u.lastName();
+        ret.userName = u.username();
+        return ret;
+    }
+
+    public Long getId() {
+        return id;
+    }
+
+    public void setId(Long id) {
+        this.id = id;
+    }
+
+    public String getFirstName() {
+        return firstName;
+    }
+
+    public void setFirstName(String firstName) {
+        this.firstName = firstName;
+    }
+
+    public String getLastName() {
+        return lastName;
+    }
+
+    public void setLastName(String lastName) {
+        this.lastName = lastName;
+    }
+
+    public String getUserName() {
+        return userName;
+    }
+
+    public void setUserName(String userName) {
+        this.userName = userName;
+    }
+}

+ 9 - 0
src/main/java/in/ocsf/these/days/app/repo/MessageRepository.java

@@ -0,0 +1,9 @@
+package in.ocsf.these.days.app.repo;/* kpmy 19.02.2017 */
+
+import in.ocsf.these.days.app.object.Message;
+import org.springframework.data.mongodb.repository.MongoRepository;
+import org.springframework.data.rest.core.annotation.RepositoryRestResource;
+
+@RepositoryRestResource(exported = false)
+public interface MessageRepository extends MongoRepository<Message, Long> {
+}

+ 2 - 0
src/main/java/in/ocsf/these/days/app/repo/UpdateStateRepository.java

@@ -2,6 +2,8 @@ package in.ocsf.these.days.app.repo;/* kpmy 19.02.2017 */
 
 import in.ocsf.these.days.app.object.UpdateState;
 import org.springframework.data.mongodb.repository.MongoRepository;
+import org.springframework.data.rest.core.annotation.RepositoryRestResource;
 
+@RepositoryRestResource(exported = false)
 public interface UpdateStateRepository extends MongoRepository<UpdateState, String> {
 }

+ 9 - 0
src/main/java/in/ocsf/these/days/app/repo/UserRepository.java

@@ -0,0 +1,9 @@
+package in.ocsf.these.days.app.repo;/* kpmy 19.02.2017 */
+
+import in.ocsf.these.days.app.object.User;
+import org.springframework.data.mongodb.repository.MongoRepository;
+import org.springframework.data.rest.core.annotation.RepositoryRestResource;
+
+@RepositoryRestResource(exported = false)
+public interface UserRepository extends MongoRepository<User, Long> {
+}

+ 32 - 0
src/main/java/in/ocsf/these/days/app/service/UpdateService.java

@@ -0,0 +1,32 @@
+package in.ocsf.these.days.app.service;/* kpmy 19.02.2017 */
+
+import com.google.common.base.Optional;
+import com.pengrad.telegrambot.model.Update;
+import in.ocsf.these.days.app.object.Message;
+import in.ocsf.these.days.app.object.User;
+import in.ocsf.these.days.app.repo.MessageRepository;
+import in.ocsf.these.days.app.repo.UserRepository;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+@Service
+public class UpdateService {
+
+    @Autowired
+    private UserRepository userRepo;
+
+    @Autowired
+    private MessageRepository msgRepo;
+
+    public void update(Update upd) {
+        com.pengrad.telegrambot.model.Message src = Optional.fromNullable(upd.message()).or(Optional.fromNullable(upd.editedMessage())).orNull();
+        if (src == null) throw new RuntimeException();
+
+        User user = userRepo.save(User.fromUser(src.from()));
+
+        Message msg = new Message();
+        msg.setId(Long.valueOf(src.messageId()));
+        msg.setSender(user);
+        msgRepo.save(msg);
+    }
+}