Уведомления

Группа в Telegram: @pythonsu

#1 Сен. 23, 2017 01:24:07

fanatikvoice
Зарегистрирован: 2017-09-23
Сообщения: 4
Репутация: +  0  -
Профиль   Отправить e-mail  

Как подправить скрипт

Доброго времени суток, подскажите пожалуйста как подправить один скрипт. Объясните мне вот что:
Как в строке 75 изменить переменные ‘server_addr’ и ‘server_port’ на переменную ‘Host name’. Вот сам скрипт:

 # -*- coding: utf-8 -*-
import discord
from discord.ext import commands
import asyncio
from tinydb import TinyDB, Query
from classes.SourceQuery import SourceQuery
from modules.WorkerFunctions import *
Search = Query()
bot = commands.Bot(command_prefix='/')
@bot.event
async def on_ready():
	print('Logged in as {0}\n'.format(bot.user.name))
@bot.event
async def on_command_error(error, ctx):
	await bot.send_message(ctx.message.channel, ":octagonal_sign: An error occurred:\n```{0}```".format(error))
@bot.command(pass_context=True, aliases=['q'], description="Queries a server and prints some if it’s info")
async def query(context, addr: str, port=27015):
	if is_valid_ip(addr):
		oServer = SourceQuery(addr=addr, port=port, timeout=5.0); lServer = oServer.getInfo()
		if lServer is not False:
			try:
				lServer['Hostname'] = lServer['Hostname'].encode('iso-8859-1').decode('utf-8')
			except:
				pass;
			em = discord.Embed(title=":lock: "+lServer['Hostname'] if bool(lServer['Password']) else ":unlock: "+lServer['Hostname'], description='Map: {0}'.format(lServer['Map']), colour=0x10EE00)
			em.set_author(name='Query result ({0}):'.format(lServer['_engine_']), icon_url=bot.user.avatar_url)
			em.add_field(name="Players", value="{0}/{1}".format(lServer['Players'], lServer['MaxPlayers']), inline=True)
			em.add_field(name="VAC", value=("Enabled" if bool(lServer['Secure']) else "Disabled"), inline=True)
			em.add_field(name="Running on", value=lServer['OS'], inline=True)
			em.add_field(name="Mod", value=lServer['GameDesc'], inline=False)
			em.add_field(name="Type", value=lServer['Dedicated'], inline=True)
			em.add_field(name="Version", value=lServer['Version'], inline=True)
			await bot.send_message(context.message.channel, embed=em)
		else:
			await bot.say(":warning: The server doesn’t seem to be running from here.")
	else:
		await bot.say(":warning: You’ve provided malformed IP address.")
@bot.command(pass_context=True, aliases=['a'], ignore_extra=True, description="Adds a server to your watchlist")
async def add(context, addr: str, port=27015):
	if is_valid_ip(addr):
		db = TinyDB('./database.json')
		db.insert({
			'userid': context.message.author.id,
			'server_addr': addr,
			'server_port': port,
		})
		db.close()
		await bot.say(":white_check_mark: Server added!")
	else:
		await bot.say(":warning: You’ve provided malformed IP address.")
@bot.command(pass_context=True, aliases=['r'], ignore_extra=True, description="Removes a server from your watchlist")
async def remove(context, addr: str, port=27015):
	if is_valid_ip(addr):
		db = TinyDB('./database.json')
		if db.search((Search.userid==context.message.author.id) & (Search.server_addr==addr) & (Search.server_port==port)) is not False:
			db.remove((Search.userid==context.message.author.id) & (Search.server_addr==addr) & (Search.server_port==port))
			await bot.say(":white_check_mark: Server removed!")
		else:
			await bot.say(":negative_squared_cross_mark: There are no records listing this server.")
		db.close()
	else:
		await bot.say(":warning: You’ve provided malformed IP address.")
@bot.command(pass_context=True, aliases=['c'], ignore_extra=True, description="Queries all servers from your watchlist")
async def check(context):
	db = TinyDB('./database.json'); lServers = db.search(Search.userid==context.message.author.id); db.close()
	em = discord.Embed(title="Server query results", description="Total servers: {0}".format(len(lServers)), colour=0x5677E8)
	for i in range(len(lServers)):
		full_addr = lServers[i]['server_addr']+":"+str(lServers[i]['server_port'])
		em.add_field(name=full_addr, value=":white_check_mark: Responded" if is_alive(lServers[i]['server_addr'], lServers[i]['server_port']) else ":warning: Didn’t respond", inline=False)
	await bot.send_message(context.message.channel, embed=em)
async def sendMessage(userid, listitem):
	user = discord.User(id=userid)
	await bot.send_message(user, "Some servers did not respond:\n```"+"\n".join(listitem)+"```")
async def crontab():
	await bot.wait_until_ready()
	while not bot.is_closed:
		db = TinyDB('./database.json'); lServers = db.all(); db.close()
		servers = ""; mList = {};
		for i in range(len(lServers)):
			if (not is_alive(lServers[i]['server_addr'], lServers[i]['server_port'])) and (not is_alive(lServers[i]['server_addr'], lServers[i]['server_port'], 15)):
				mList.setdefault(lServers[i]['userid'],[]).extend([" * "+lServers[i]["server_addr"]+":"+str(lServers[i]["server_port"])])
			else:
				continue;
		for key, value in mList.items():
			await sendMessage(key, value)
		await asyncio.sleep(120)
bot.loop.create_task(crontab())
bot.run('paste_your_token_here')

Офлайн

#2 Сен. 23, 2017 07:08:10

PEHDOM
Зарегистрирован: 2016-11-28
Сообщения: 2196
Репутация: +  294  -
Профиль   Отправить e-mail  

Как подправить скрипт

для начала, правильно скопипастить код, потому как в том, что вы выложили, 75-я строка выглядит вот так:

 ...
    await bot.wait_until_ready()
...
где там переменные ‘server_addr’ и ‘server_port’ ?



==============================
Помещайте код в теги:
[code python][/code]
Бериегите свое и чужое время.

Отредактировано PEHDOM (Сен. 23, 2017 07:09:33)

Офлайн

#3 Сен. 23, 2017 09:51:33

JOHN_16
От: Россия, Петропавловск-Камчатск
Зарегистрирован: 2010-03-22
Сообщения: 3292
Репутация: +  221  -
Профиль   Отправить e-mail  

Как подправить скрипт

PEHDOM
это проблема вставки кода в форум - пустые строки обрезаются



_________________________________________________________________________________
полезный блог о python john16blog.blogspot.com

Офлайн

#4 Сен. 23, 2017 15:22:20

fanatikvoice
Зарегистрирован: 2017-09-23
Сообщения: 4
Репутация: +  0  -
Профиль   Отправить e-mail  

Как подправить скрипт

Вот если что оригинал кода - https://yadi.sk/i/qvQGQv5Q3NALQq

Офлайн

#5 Сен. 26, 2017 12:09:46

PEHDOM
Зарегистрирован: 2016-11-28
Сообщения: 2196
Репутация: +  294  -
Профиль   Отправить e-mail  

Как подправить скрипт

fanatikvoice а не можете залить куданить типа гуглдрайва? а то в Украине проблема с доступом к яндексам-вконтактам-однокласникам. А ТОР почемуто не хочет скачивать.
JOHN_16 согласен, признаю свою ошибку, но всеже в коде слишком много строк с одержащих ‘server_addr’ и ‘server_port’ чтобы однозначно найти нужную..



==============================
Помещайте код в теги:
[code python][/code]
Бериегите свое и чужое время.

Офлайн

#6 Сен. 26, 2017 13:18:37

fanatikvoice
Зарегистрирован: 2017-09-23
Сообщения: 4
Репутация: +  0  -
Профиль   Отправить e-mail  

Как подправить скрипт

PEHDOM
Да, конечно https://drive.google.com/open?id=0B-YsuXeaXeasZ0hlU3B6SE0tVW8


ПС
Если я правильно понял, то, что бы поменять в 75й то скорее надо переписывать tynydb (бд от которой работает скрипт).

Офлайн

#7 Сен. 27, 2017 14:32:54

PEHDOM
Зарегистрирован: 2016-11-28
Сообщения: 2196
Репутация: +  294  -
Профиль   Отправить e-mail  

Как подправить скрипт

fanatikvoice
Если я правильно понял, то, что бы поменять в 75й то скорее надо переписывать tynydb (бд от которой работает скрипт).
П идее да.Я так понял имееться ввиду эта строчка?
 full_addr = lServers[i]['server_addr']+":"+str(lServers[i]['server_port'])
оно нужно я так понимаю исключительно для некоего текстового престравления.
lServers мы получаем из TinyDB : lServers = db.search(….) и на выходе получаем список словарей с ключами ‘userid’,'server_addr' и ‘server_port’,
Вам нужно добавить туда еще один ключ ‘host_name’. Добавление в базу осуществляюеться тут:
 async def add(context, addr: str, port=27015):
	if is_valid_ip(addr):
		db = TinyDB('./database.json')
		db.insert({
			'userid': context.message.author.id,
			'server_addr': addr,
			'server_port': port,
		})
               db.close()
Вам нужно или передавать ‘host_name’ еще однима аргументом, или вычислять его какимто образом уже “на месте” как это сделано в async def query





==============================
Помещайте код в теги:
[code python][/code]
Бериегите свое и чужое время.

Отредактировано PEHDOM (Сен. 27, 2017 14:41:13)

Офлайн

#8 Сен. 28, 2017 13:45:21

fanatikvoice
Зарегистрирован: 2017-09-23
Сообщения: 4
Репутация: +  0  -
Профиль   Отправить e-mail  

Как подправить скрипт

PEHDOM
Если честно, то Питон я вообще не знаю (мне не преподавали этот язык), и как добавить - я немного не понимаю.

Офлайн

#9 Сен. 29, 2017 14:24:14

PEHDOM
Зарегистрирован: 2016-11-28
Сообщения: 2196
Репутация: +  294  -
Профиль   Отправить e-mail  

Как подправить скрипт

fanatikvoice
Если честно, то Питон я вообще не знаю (мне не преподавали этот язык), и как добавить - я немного не понимаю.
это плохо, не люблю писать код который не могу проверить, но самое простое решение будет выглядеть както так:
 .....
 .....
@bot.command(pass_context=True, aliases=['c'], ignore_extra=True, description="Queries all servers from your watchlist")
async def check(context):
    db = TinyDB('./database.json'); lServers = db.search(Search.userid==context.message.author.id); db.close()
    em = discord.Embed(title="Server query results", description="Total servers: {0}".format(len(lServers)), colour=0x5677E8)
    for i in range(len(lServers)):
        oServer = SourceQuery(addr=lServers[i]['server_addr'], port=lServers[i]['server_port'], timeout=5.0); lServer = oServer.getInfo()
        if lServer is not False:
            try:
                full_addr = lServer['Hostname'].encode('iso-8859-1').decode('utf-8')
            except:
                full_addr = lServers[i]['server_addr']+":"+str(lServers[i]['server_port'])
        else:
                full_addr = lServers[i]['server_addr']+":"+str(lServers[i]['server_port'])
        em.add_field(name=full_addr, value=":white_check_mark: Responded" if is_alive(lServers[i]['server_addr'], lServers[i]['server_port']) else ":warning: Didn’t respond", inline=False)
    await bot.send_message(context.message.channel, embed=em)
.....
.....
Оно не требует никаких дополнительных телодвижений с БД, но допускаю что оно не самое быстрое, потому как не знаю насколько часто дерается метод async def check(context).
Возможно стиоит это делать один раз в async def add
тогда код будет выглядеть както так:
 .....
async def add(context, addr: str, port=27015):
    if is_valid_ip(addr):
        db = TinyDB('./database.json')
        oServer = SourceQuery(addr=addr, port=port, timeout=5.0); lServer = oServer.getInfo()
        if lServer is not False:
            host_name = lServer['Hostname'].encode('iso-8859-1').decode('utf-8')
        else:
            host_name = None
        db.insert({
            'userid': context.message.author.id,
            'server_addr': addr,
            'server_port': port,
            'host_name': host_name,
        })
.....
async def check(context):
    db = TinyDB('./database.json'); lServers = db.search(Search.userid==context.message.author.id); db.close()
    em = discord.Embed(title="Server query results", description="Total servers: {0}".format(len(lServers)), colour=0x5677E8)
    for i in range(len(lServers)):
        if lServers[i]['host_name']:
            full_addr = lServers[i]['host_name']
        else:
            full_addr = lServers[i]['server_addr']+":"+str(lServers[i]['server_port'])
......
дальше насколько хватит вашей фантазии. ИМХО я бы кусок кода где мы получаем имя сервера вынес в отдельную функцию, поскольку он у нас повторяеться несколько раз.
Но тут уже вам решать..
А вообще если у вас все уперлось только в знание синатксиса, а не програмирование в целом, то вмето чтения Лутцев достаточно ознакомиться вот с этим https://pythonworld.ru/samouchitel-python это займет не более пары дней, чтобы начать хоть чтото понимать, и вносить правки в скрипт не наобум..



==============================
Помещайте код в теги:
[code python][/code]
Бериегите свое и чужое время.

Отредактировано PEHDOM (Сен. 29, 2017 14:29:27)

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version