Задать вопрос
  • Как сделать боту комманду включения музыки по ссылки с ютуба на голосовом канале?

    h0w4rd
    @h0w4rd
    Python dev.
    Я даже не стал вникать в суть, просто посмотрел на код 30 секунд. Рекомендую почитать комментарии и последовать советам. И пожелаю удачи.
    import discord
    from discord.ext import commands
    # У меня зрение -3,5, но использования этого я не увидел.
    from pytube import YouTube
    
    bot = commands.Bot(command_prefix="!")
    # Все что, не закрыто иксами - можно узнать. А, что закрыто - секретно и ДОЛЖНО быть скрыто. А лучше вообще токен не показывать)
    TOKEN = "Njc1MzUwNTkzOTIwODI3Mzk0.xxxxx.xxxxx-xxxxx"
    yt_url = 'https://www.youtube.com/results?'
    game = discord.Game("Krunker.io")
    
    @bot.event # загрузка
    async def on_ready():
        print("Bot was launched!")
        await bot.change_presence(activity=game)
    
    @bot.command(pass_context=True)
    async def music(ctx, channel):
        url = ctx.message.content # вернет что-то вроде "!music youtube.com/watch"
        url = url.strip('https://www.youtube.com/watch?v=naIKplXzxTY') # почитайте что делает strip()
    
        vc = await bot.connect() # "бот, подключись!", а куда не сказано.
        vc.play(discord.FFmpegPCMAudio(url)) # ссылка на HTML страницу... а нужно АУДИО поток, а не станица. библиотека не может догадаться, что от нее хотят.
        vc.is_playing() # почитайте про "if"
        vc.pause() # зачем останавливать поток
        vc.resume() # и включать ._.
        vc.stop() # а после останавливать
    
    bot.run(TOKEN)
    Ответ написан
    Комментировать
  • Как настроить отдачу метрик с nginx?

    rqdkmndh
    @rqdkmndh
    Web-разработчик
    Такой вариант в nginx.conf:
    server {
            listen       80;
            server_name  localhost;
    
            location / {
                root   /var/www/html;
                index  index.php;
            }
    
            location /metrics {
                stub_status;
                allow 127.0.0.1;
                deny all;
            }
    
            location ~ \.php$ {
                root           /var/www/html;
                fastcgi_pass   127.0.0.1:9000;
                fastcgi_index  index.php;
                fastcgi_param  SCRIPT_FILENAME  /var/www/html$fastcgi_script_name;
                include        fastcgi_params;
            }
        }

    Описание метрик Nginx /metrics:
    Active connections — текущее количество активных соединений.
    accepts — общее количество соединений, принятых сервером.
    handled — количество соединений, обработанных сервером (совпадает с accepts, если нет ошибок).
    requests — общее количество обработанных запросов.
    Reading — количество соединений, которые Nginx читает от клиента.
    Writing — количество соединений, в которые Nginx пишет ответ клиенту.
    Waiting — количество keep-alive соединений, которые открыты и ожидают нового запроса.

    stub_status — это директива, которая включает модуль ngx_http_stub_status_module. Этот модуль выводит минимальную статистику о текущем состоянии Nginx
    Ответ написан
    Комментировать
  • Как передать в лямбду контекст класса?

    @MarkusD Куратор тега C++
    все время мелю чепуху :)
    Drottarutarnum, p = { s }; - это Copy Initialization.
    В буквальном смысле, что тут происходит. Сперва ты создаешь temporary local через конструктор Protocol::Protocol(Serial &s). Следом, через operator =, который сводится к конструктору копирования/перемещения, ты делаешь Copy Construction объекта p. Делается это через конструктор копирования/перемещения по умолчанию, который просто копирует/перемещает поля используя их конструкторы копирования/перемещения.

    Лямбда создается внутри temporary local значения, т.к. именно для него вызывается соответствующий конструктор. Далее эта лямбда остается жить в объекте Serial, а сам temporary local уничтожается сразу же после конструирования p.

    После этого в замыкании лямбды остается dangling pointer на уже уничтоженный this.

    Одним из возможных решений данной проблемы может быть не p = { s };, а p{ s }; или, как ты уже описал, p = s;. Такой тип инициализации уже называется Value Initialization. Но по своей сути это только отсрочка проблемы. Тебе придется очень пристально следить за жизнью такого объекта, т.к. вероятность обрести все тот же висячий указатель в замыкании в следствии неявного копирования крайне высока.

    Другим из возможных решений такой проблемы может быть использование std::enable_shared_from_this[?], std::shared_ptr[?] для хранения протокола и std::weak_ptr[?] в замыкании твоей лямбды. Этот метод гарантированно решит твою проблему, но может привести к ряду других проблем с возможной утечкой ресурсов.

    В качестве еще одного способа - научить Serial отцеплять лямбду уничтожаемого Protocol и написать правильный конструктор копирования Protocol, соблюдая правило 3/5/0.

    В общем смысле, тебе стоит внимательнее смотреть за тем, какие операции ты выполняешь над объектами, сырой указатель на которые ты хочешь где-то сохранить.
    Ответ написан
    2 комментария
  • Как выполнить запрос в Laravel?

    ubukulov
    @ubukulov
    Веб-разработчик
    Во первых у вас в запросе ошибка. Она должно быть как-то так.
    SELECT * FROM `cards` 
    INNER JOIN `mechanics_field` ON `mechanics_field`.card_id=`cards`.id
    WHERE `mechanics_field`.`mechanics_id` = 1 and `cards`.`cost` = 3


    А этот же запрос в конструкторе Laravel:

    $result = DB::table('cards')
    	->join('mechanics_field', 'mechanics_field.mechanics_id', '=', 'cards.mechanic_id')
    	->where(['mechanics_field.mechanics_id' => 1, 'cards.cost' => 3])
    	->get();


    А если имеется модель Card, то можно так написать:
    $result = Card::where(['mechanics_field.mechanics_id' => 1, 'cards.cost' => 3])
    			->select('cards.*')
    			->join('mechanics_field', 'mechanics_field.mechanics_id', '=', 'cards.mechanic_id')
    			->get();
    Ответ написан
    Комментировать