8
8
9
9

10
10
"""
11
- import logging
12
11
from os import getenv
12
+ from warnings import warn
13
13
14
- try :
15
- from disco .client import Client , ClientConfig
16
- except ImportError :
17
- raise ImportError ("Please `pip install disco-py`" )
14
+ from requests import Session
15
+ from requests .utils import default_user_agent
18
16
19
17
from ..auto import tqdm as tqdm_auto
18
+ from ..std import TqdmWarning
19
+ from ..version import __version__
20
20
from .utils_worker import MonoWorker
21
21
22
- __author__ = {"github.com/" : ["casperdcl" ]}
22
+ __author__ = {"github.com/" : ["casperdcl" , "guigoruiz1" ]}
23
23
__all__ = ['DiscordIO' , 'tqdm_discord' , 'tdrange' , 'tqdm' , 'trange' ]
24
24
25
25
26
26
class DiscordIO (MonoWorker ):
27
27
"""Non-blocking file-like IO using a Discord Bot."""
28
+ API = "https://discord.com/api/v10"
29
+ UA = f"tqdm (https://tqdm.github.io, { __version__ } ) { default_user_agent ()} "
30
+
28
31
def __init__ (self , token , channel_id ):
29
32
"""Creates a new message in the given `channel_id`."""
30
33
super ().__init__ ()
31
- config = ClientConfig ()
32
- config . token = token
33
- client = Client ( config )
34
+ self . token = token
35
+ self . channel_id = channel_id
36
+ self . session = Session ( )
34
37
self .text = self .__class__ .__name__
38
+ self .message_id
39
+
40
+ @property
41
+ def message_id (self ):
42
+ if hasattr (self , '_message_id' ):
43
+ return self ._message_id
35
44
try :
36
- self .message = client .api .channels_messages_create (channel_id , self .text )
45
+ res = self .session .post (
46
+ f'{ self .API } /channels/{ self .channel_id } /messages' ,
47
+ headers = {'Authorization' : f'Bot { self .token } ' , 'User-Agent' : self .UA },
48
+ json = {'content' : f"`{ self .text } `" }).json ()
37
49
except Exception as e :
38
50
tqdm_auto .write (str (e ))
39
- self .message = None
51
+ else :
52
+ if res .get ('error_code' ) == 429 :
53
+ warn ("Creation rate limit: try increasing `mininterval`." ,
54
+ TqdmWarning , stacklevel = 2 )
55
+ else :
56
+ self ._message_id = res ['id' ]
57
+ return self ._message_id
40
58
41
59
def write (self , s ):
42
- """Replaces internal `message `'s text with `s`."""
60
+ """Replaces internal `message_id `'s text with `s`."""
43
61
if not s :
44
62
s = "..."
45
63
s = s .replace ('\r ' , '' ).strip ()
46
64
if s == self .text :
47
- return # skip duplicate message
48
- message = self .message
49
- if message is None :
65
+ return # avoid duplicate message Bot error
66
+ message_id = self .message_id
67
+ if message_id is None :
50
68
return
51
69
self .text = s
52
70
try :
53
- future = self .submit (message .edit , '`' + s + '`' )
71
+ future = self .submit (
72
+ self .session .patch ,
73
+ f'{ self .API } /channels/{ self .channel_id } /messages/{ message_id } ' ,
74
+ headers = {'Authorization' : f'Bot { self .token } ' , 'User-Agent' : self .UA },
75
+ json = {'content' : f"`{ self .text } `" })
76
+ except Exception as e :
77
+ tqdm_auto .write (str (e ))
78
+ else :
79
+ return future
80
+
81
+ def delete (self ):
82
+ """Deletes internal `message_id`."""
83
+ try :
84
+ future = self .submit (
85
+ self .session .delete ,
86
+ f'{ self .API } /channels/{ self .channel_id } /messages/{ self .message_id } ' ,
87
+ headers = {'Authorization' : f'Bot { self .token } ' , 'User-Agent' : self .UA })
54
88
except Exception as e :
55
89
tqdm_auto .write (str (e ))
56
90
else :
@@ -75,22 +109,18 @@ def __init__(self, *args, **kwargs):
75
109
"""
76
110
Parameters
77
111
----------
78
- token : str, required. Discord token
112
+ token : str, required. Discord bot token
79
113
[default: ${TQDM_DISCORD_TOKEN}].
80
114
channel_id : int, required. Discord channel ID
81
115
[default: ${TQDM_DISCORD_CHANNEL_ID}].
82
- mininterval : float, optional.
83
- Minimum of [default: 1.5] to avoid rate limit.
84
116
85
117
See `tqdm.auto.tqdm.__init__` for other parameters.
86
118
"""
87
119
if not kwargs .get ('disable' ):
88
120
kwargs = kwargs .copy ()
89
- logging .getLogger ("HTTPClient" ).setLevel (logging .WARNING )
90
121
self .dio = DiscordIO (
91
- kwargs .pop ('token' , getenv ("TQDM_DISCORD_TOKEN" )),
92
- kwargs .pop ('channel_id' , getenv ("TQDM_DISCORD_CHANNEL_ID" )))
93
- kwargs ['mininterval' ] = max (1.5 , kwargs .get ('mininterval' , 1.5 ))
122
+ kwargs .pop ('token' , getenv ('TQDM_DISCORD_TOKEN' )),
123
+ kwargs .pop ('channel_id' , getenv ('TQDM_DISCORD_CHANNEL_ID' )))
94
124
super ().__init__ (* args , ** kwargs )
95
125
96
126
def display (self , ** kwargs ):
@@ -108,6 +138,13 @@ def clear(self, *args, **kwargs):
108
138
if not self .disable :
109
139
self .dio .write ("" )
110
140
141
+ def close (self ):
142
+ if self .disable :
143
+ return
144
+ super ().close ()
145
+ if not (self .leave or (self .leave is None and self .pos == 0 )):
146
+ self .dio .delete ()
147
+
111
148
112
149
def tdrange (* args , ** kwargs ):
113
150
"""Shortcut for `tqdm.contrib.discord.tqdm(range(*args), **kwargs)`."""
0 commit comments