1 module telega.helpers;
2 
3 import telega.botapi : BotApi;
4 import telega.telegram.basic : UpdateType, Update, getUpdates;
5 
6 class UpdatesRange
7 {
8     import std.algorithm.comparison : max;
9 
10     enum bool empty = false;
11 
12     protected:
13         BotApi _api;
14         uint _maxUpdateId;
15 
16         UpdateType[] _allowedUpdates = [];
17         ubyte _updatesLimit = 5;
18         uint _timeout = 30;
19 
20     private:
21         bool _isEmpty;
22         Update[] _updates;
23         ushort _index;
24 
25     public: @safe:
26         this(BotApi api, uint maxUpdateId = 0, ubyte limit = 5, uint timeout = 30)
27         {
28             _api = api;
29             _maxUpdateId = maxUpdateId;
30             _updatesLimit = limit;
31             _timeout = timeout;
32 
33             _updates.reserve(_updatesLimit);
34         }
35 
36         @property
37         uint maxUpdateId()
38         {
39             return _maxUpdateId;
40         }
41 
42         auto front()
43         {
44             if (_updates.length == 0) {
45                 getUpdates();
46                 _maxUpdateId = max(_maxUpdateId, _updates[_index].id);
47             }
48 
49             return _updates[_index];
50         }
51 
52         void popFront()
53         {
54             _maxUpdateId = max(_maxUpdateId, _updates[_index].id);
55 
56             if (++_index >= _updates.length) {
57                 getUpdates();
58             }
59         }
60 
61     protected:
62         @trusted
63         void getUpdates()
64         {
65             do {
66                 _updates = _api.getUpdates(
67                     _maxUpdateId+1,
68                     _updatesLimit,
69                     _timeout,
70                     _allowedUpdates
71                 );
72             } while (_updates.length == 0);
73             _index = 0;
74         }
75 }
76 
77 @safe @nogc nothrow pure
78 bool isMessageType(in Update update)
79 {
80     return !update.message.isNull;
81 }