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 }