-
Notifications
You must be signed in to change notification settings - Fork 0
/
Bot.py
239 lines (196 loc) · 8.73 KB
/
Bot.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
import discord
from discord.ext import commands
from setting import TOKEN,appid
import requests
import math
intents = discord.Intents.default()
intents.message_content = True
bot = commands.Bot(command_prefix='!', intents=intents)
@bot.event
async def on_ready():
print(f'We have logged in as {bot.user}')
class SimpleView(discord.ui.View):
foo : bool = None
weatherNowbool : bool = None
async def send(self, ctx):
self.message = await ctx.send(view=self)
await self.update_message(self.data[:self.sep])
async def disable_all_items(self):
for item in self.children:
item.disabled = True
await self.message.edit(view=self)
async def on_timeout(self) -> None:
await self.message.channel.send("TimeOut")
await self.disable_all_items()
@discord.ui.button(label="Погода сейчас",
style=discord.ButtonStyle.success)
async def weathernow(self, interaction: discord.Interaction, button: discord.ui.Button):
self.weatherNowbool = True
# msg = await interaction.response.send_message("https://cdn.discordapp.com/emojis/1138172643867111595.gif?size=96&quality=lossless")
# await msg.delete()
await weatherNow()
await interaction.response.send_message(f"температура: {datanow['main']['temp']}° \n \t \t \t погода: {datanow['weather'][0]['description']} {word} \n \t \t \t макс.температура: {datanow['main']['temp_min']}° \n \t \t \t мини.температура: {datanow['main']['temp_max']}°")
self.foo = True
self.stop()
@discord.ui.button(label="Погоды на 5 дней",
style=discord.ButtonStyle.blurple)
async def weatherfor5days(self, interaction: discord.Interaction, button: discord.ui.Button):
# msg = await interaction.response.send_message("https://cdn.discordapp.com/emojis/1138172643867111595.gif?size=96&quality=lossless")
self.weatherNowbool = False
global city
city = s_city
city_id = 0
res = requests.get("http://api.openweathermap.org/data/2.5/find",
params={'q': s_city, 'type': 'like', 'units': 'metric', 'APPID': appid})
datanow = res.json()
cities = ["{} ({})".format(d['name'], d['sys']['country'])
for d in datanow['list']]
print("city:", cities)
try:
city_id = datanow['list'][0]['id']
city_id = city_id
print("success")
except:
city_id = 524901
print("fail")
print('city_id=', city_id)
res = requests.get("http://api.openweathermap.org/data/2.5/forecast",
params={'id': city_id, 'units': 'metric', 'lang': 'ru', 'APPID': appid})
dataweather = res.json()
global data
data = []
for i in dataweather['list']:
data.append(f"дата/время: {i['dt_txt']} \n \t \t \t температура: {'{0:+3.0f}'.format(i['main']['temp'])}° \n \t \t \t погода: {i['weather'][0]['description']}")
await interaction.response.send_message("success")
self.foo = True
self.stop()
class Pagination_View(discord.ui.View):
current_page : int = 1
sep : int = 5
async def send(self, ctx):
self.message = await ctx.send(view=self)
await self.update_message(self.data[:self.sep])
def create_embed(self, data):
embed = discord.Embed(title=f"Погода на 5 дней: страница {self.current_page} / {math.ceil(len(self.data) / self.sep)}")
for item in data:
embed.add_field(name=item, value=item, inline=False)
return embed
async def update_message(self,data):
self.update_buttons()
await self.message.edit(embed=self.create_embed(data), view=self)
def update_buttons(self):
if self.current_page == 1:
self.first_page_button.disabled = True
self.prev_button.disabled = True
self.first_page_button.style = discord.ButtonStyle.gray
self.prev_button.style = discord.ButtonStyle.gray
else:
self.first_page_button.disabled = False
self.prev_button.disabled = False
self.first_page_button.style = discord.ButtonStyle.green
self.prev_button.style = discord.ButtonStyle.primary
if self.current_page == int(len(self.data) / self.sep) + 1:
self.next_button.disabled = True
self.last_page_button.disabled = True
self.last_page_button.style = discord.ButtonStyle.gray
self.next_button.style = discord.ButtonStyle.gray
else:
self.next_button.disabled = False
self.last_page_button.disabled = False
self.last_page_button.style = discord.ButtonStyle.green
self.next_button.style = discord.ButtonStyle.primary
def get_current_page_data(self):
until_item = self.current_page * self.sep
from_item = until_item - self.sep
if not self.current_page == 1:
from_item = 0
until_item = self.sep
if self.current_page == int(len(self.data) / self.sep) + 1:
from_item = self.current_page * self.sep - self.sep
until_item = len(self.data)
return self.data[from_item:until_item]
@discord.ui.button(label="|<",
style=discord.ButtonStyle.green)
async def first_page_button(self, interaction:discord.Interaction, button: discord.ui.Button):
await interaction.response.defer()
self.current_page = 1
await self.update_message(self.get_current_page_data())
@discord.ui.button(label="<",
style=discord.ButtonStyle.primary)
async def prev_button(self, interaction:discord.Interaction, button: discord.ui.Button):
await interaction.response.defer()
self.current_page -= 1
await self.update_message(self.get_current_page_data())
@discord.ui.button(label=">",
style=discord.ButtonStyle.primary)
async def next_button(self, interaction:discord.Interaction, button: discord.ui.Button):
await interaction.response.defer()
self.current_page += 1
await self.update_message(self.get_current_page_data())
@discord.ui.button(label=">|",
style=discord.ButtonStyle.green)
async def last_page_button(self, interaction:discord.Interaction, button: discord.ui.Button):
await interaction.response.defer()
self.current_page = math.ceil(len(self.data) / self.sep)
await self.update_message(self.get_current_page_data())
async def weatherNow():
global datanow
global emojes
global word
emojes = {
"пасмурно": [":cloud:"],
"ясно": [":sunny:"],
"облачно с прояснениями": [":white_sun_cloud: "],
"дождь": [":cloud_rain:"],
"переменная облачность": [":white_sun_small_cloud: "]
}
city_id = 0
res = requests.get("http://api.openweathermap.org/data/2.5/find",
params={'q': s_city, 'type': 'like', 'units': 'metric', 'APPID': appid})
datanow = res.json()
cities = ["{} ({})".format(d['name'], d['sys']['country'])
for d in datanow['list']]
print("city:", cities)
try:
city_id = datanow['list'][0]['id']
city_id = city_id
print("success")
except:
city_id = 524901
print("fail")
res = requests.get("http://api.openweathermap.org/data/2.5/weather",
params={'id': city_id, 'units': 'metric', 'lang': 'ru', 'APPID': appid})
datanow = res.json()
# print(data)
word = datanow["weather"][0]['description']
word = emojes.get(word, [])
word = "".join(word)
if not word:
print("no")
print(s_city)
@bot.command()
async def weather(ctx, s_city2):
global s_city
s_city = s_city2
view = SimpleView(timeout=15)
# button = discord.ui.Button(label="Clck me")
# view.add_item(button)
message = await ctx.send(view=view)
view.message = message
await view.wait()
await view.disable_all_items()
if view.weatherNowbool is False:
pagination_view = Pagination_View()
pagination_view.data = data
await pagination_view.send(ctx)
if view.foo is None:
print("timeOut")
elif view.foo is True:
print("ok")
else:
print("cancell")
@weather.error
async def info_error(ctx, error):
if isinstance(error, discord.ext.commands.errors.MissingRequiredArgument):
await ctx.send('sorry you need to enter city name')
bot.run(TOKEN)