Задать вопрос
  • Как в EF Core 9 произвести поиск совпадений на русском и без учета регистра?

    Lapita12
    @Lapita12
    Почитай про ConfigureConventions
    вот пример с ним:

    public class ApplicationDbContext : DbContext
    {
        protected override void ConfigureConventions(ModelConfigurationBuilder configurationBuilder)
        {
            configurationBuilder.Properties<string>().UseCollation("CYRILLIC_NOCASE");
        }
    
        protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
        {
            optionsBuilder.UseSqlite(connectionString);
            
            optionsBuilder.AddInterceptors(new SqliteCollationInterceptor());
        }
    }
    
    public class SqliteCollationInterceptor : DbConnectionInterceptor
    {
        public override void ConnectionOpened(DbConnection connection, ConnectionEndEventData eventData)
        {
            if (connection is SqliteConnection sqliteConnection)
            {
                sqliteConnection.CreateCollation("CYRILLIC_NOCASE", (x, y) =>
                    string.Compare(x, y, CultureInfo.CurrentCulture, CompareOptions.IgnoreCase));
            }
            
            base.ConnectionOpened(connection, eventData);
        }
    }
    Написано
  • Пермач после авторизации [WTelegram,TDLib] как исправить?

    Lapita12
    @Lapita12
    Dafsas, Да, конечно
    в остальном случае мне кажется это 90+% бан т.к телеграмм это отслеживает
    Написано
  • Пермач после авторизации [WTelegram,TDLib] как исправить?

    Lapita12
    @Lapita12
    Dafsas, У меня такой проблемы нет, но думаю тебе только в техподдержку осталось написать(т.к в коде нет явных проблем вообще, всё супер) сомневаюсь правда что они тебе помогут (хотя шанс есть) Xd
    Написано
  • Пермач после авторизации [WTelegram,TDLib] как исправить?

    Lapita12
    @Lapita12
    maksam07, Странно что банит, но попробуй(SessionPath в коде хз как реализовано, не указана реализация):
    WTelegram
    private static readonly string SESSION_FILE = Path.Combine(
        Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData),
        "MyTelegramApp",
        "session.dat"
    );
    
    static string? Config(string what)
    {
        Directory.CreateDirectory(Path.GetDirectoryName(SESSION_FILE));
        
        return what switch
        {
            "api_id" => "YOUR_REAL_API_ID",
            "api_hash" => "YOUR_REAL_API_HASH",
            "phone_number" => SetPhoneNumber(),
            "verification_code" => SetVerificationCode(),
            "password" => SetPassword2FA(),
            "session_pathname" => SESSION_FILE, // ФИКСИРОВАННЫЙ ПУТЬ!
            
            "device_model" => "PC",
            "system_version" => "Windows 10",
            "app_version" => "1.35.0",
            _ => null
        };
    }
    
    static async Task InitializationMyProfile()
    {
        try
        {
            WTelegram.Helpers.Log = (lvl, str) => 
                Console.WriteLine($"[{DateTime.Now:HH:mm:ss}] {lvl}: {str}");
            
            bool hasSession = File.Exists(SESSION_FILE);
            Console.WriteLine(hasSession 
                ? "✓ Загружаю существующую сессию..." 
                : "⚠ Создаю новую сессию...");
            
            MyClient = new Client(Config);
            MyUser = await MyClient.LoginUserIfNeeded();
            
            Console.WriteLine($"✓ Авторизован: {MyUser.first_name} {MyUser.last_name}");
            Console.WriteLine($"✓ Файл сессии: {SESSION_FILE}");
        }
        catch (Exception ex)
        {
            Console.WriteLine($"✗ Ошибка: {ex.Message}");
            throw;
        }
    }


    TDLib:
    private static readonly string DB_PATH = Path.Combine(
        Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData),
        "MyTelegramApp",
        "tdlib_database"
    );
    
    private static readonly string FILES_PATH = Path.Combine(
        Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData),
        "MyTelegramApp",
        "tdlib_files"
    );
    
    static async Task Main()
    {
        Console.OutputEncoding = System.Text.Encoding.UTF8;
        
        Directory.CreateDirectory(DB_PATH);
        Directory.CreateDirectory(FILES_PATH);
        
        _client = CreateTdClient();
    
        await _client.ExecuteAsync(new TdApi.SetLogVerbosityLevel { NewVerbosityLevel = 2 });
    
        while (!_haveAuthorization)
        {
            await Task.Delay(500);
        }
    
        Console.WriteLine("✅ Авторизация успешно завершена!");
        Console.WriteLine($"✅ База данных: {DB_PATH}");
    }
    
    private static async Task OnAuthorizationStateUpdate(TdApi.AuthorizationState state)
    {
        if (state != null)
            _state = state;
    
        switch (_state)
        {
            case TdApi.AuthorizationState.AuthorizationStateWaitTdlibParameters:
                
                bool hasDatabase = Directory.Exists(DB_PATH) && 
                                   Directory.GetFiles(DB_PATH).Length > 0;
                
                Console.WriteLine(hasDatabase 
                    ? "✓ Загружаю существующую сессию из базы данных..." 
                    : "⚠ Создаю новую базу данных...");
                
                await _client.ExecuteAsync(new TdApi.SetTdlibParameters
                {
                    DatabaseDirectory = DB_PATH,
                    FilesDirectory = FILES_PATH,
                    
                    UseMessageDatabase = false,  
                    UseChatInfoDatabase = false, 
                    UseSecretChats = true,
                    
                    ApiId = YOUR_REAL_API_ID,
                    ApiHash = "YOUR_REAL_API_HASH",
                    
                    SystemLanguageCode = "ru",
                    DeviceModel = "Desktop",
                    SystemVersion = "Windows 10",
                    ApplicationVersion = "1.0",
                    
                    EnableStorageOptimizer = true,
                    IgnoreFileNames = false
                });
                break;
    
    // дальше всё также как и в коде
    
        }
    }
    Написано
  • Как сделать кик со всех бесед где состоит пользователь?

    Lapita12
    @Lapita12
    import re
    
    def kick_user_from_all_chats(user_id):
        # Получаем список всех чатов, в которых участвует пользователь
        chat_list = []
        # Заполните chat_list, используя ваш собственный код для получения списка чатов с участником user_id
    
        for chat_id in chat_list:
            # Удаляем пользователя из каждой беседы
            authorize.method('messages.removeChatUser', {
                'chat_id': chat_id,
                'user_id': user_id
            })
    
    if msg_lower[1:] == 'kick' or msg_lower[1:].startswith('kick '):
        try:
            user_id = re.findall(r'\[id(\d*)\|.*]', msg_orig)
            local = msg.split(' ')
            reason = ' '.join(map(str, local[2:999]))
    
            user = authorize.method("users.get", {"user_ids": user_id})
            fullname = user['first_name'] + ' ' + user['last_name']
    
            user1 = authorize.method("users.get", {"user_ids": uid, "name_case": 'gen'})
            fullname1 = user1['first_name'] + ' ' + user1['last_name']
    
            if not reason:
                write_message(sender, "❌ | Укажите причину!")
            else:
                kick_user_from_all_chats(user_id)
                write_message(sender, f"Администратор [id{user_id}|{fullname}] Был исключен по запросу [id|{fullname1}].\nПричина: {reason.capitalize()}")
        except:
            write_message(sender, "❌ | Используйте /kick [id пользователя)] [reason]")
  • Почему gsap не меняет изображение?

    Lapita12
    @Lapita12
    Jussss92,Попробуй так

    npm install gsap@latest
    npm install gsap@latest --save-dev
    npm install gsap-blur


    import { gsap } from "gsap";
    import { blur } from "gsap-blur";
    
    const img = document.querySelector("#communication-img img");     
    const newImgSrc = "/assets/img/communication/chat1.png";
    
    gsap.timeline()
     .to(img, {
        attr:{src:newImgSrc},
        duration: 1, 
        ease: "none", 
        modifiers: {
          blur: blur
        },
        blur: 50
     })
  • В чём проблема OpenAI?

    Lapita12
    @Lapita12
    import openai
    
    client = openai.Client()
    
    PROMPT = "Что такое OpenAI?"
    HISTORY = "OpenAI - это компания, которая разрабатывает искусственный интеллект."
    
    edited_news_text = client.chat.responses.create(
        model="gpt-3.5-turbo",
        prompts=[PROMPT, HISTORY],
        stream=False,
    )
    
    print(edited_news_text.choices[0].message.content)
  • Как получить peer_id в vk api python?

    Lapita12
    @Lapita12
    import vk
    
    token = "ваш токен"
    
    vk_api = vk.API(token=token)
    
    def get_peer_id():
        conversations = vk_api.messages.getConversations(count=1)
        return conversations[0].peer_id
    
    if input("/peer_id: ") == "/peer_id":
        print(get_peer_id())
  • Как исправить ошибку бота, связанную с отстутсвием атрибута user_name?

    Lapita12
    @Lapita12
    def new_user(self, bot, chat_id, user_tg_id, user_name, language_code, link):
        self._model.chat_id = chat_id
        self._model.user_tg_id = user_tg_id
    
        result = asyncio.run(db.insert_user(self._model))
        self._model = result._data[0]
    
        if user_name is not None:
            self.user_info = User_info(self._model, user_name, language_code, True)
        else:
            self.user_info = User_info(self._model, "", language_code, True)
    
        self.status = enums.user_status.user
        self.checkReferal(bot, link)
  • Использую opentele для конвертации tdata в telethon.session. На tdesk.ToTelethon зависает, что делать?

    Lapita12
    @Lapita12
    Попробуй код ниже и скажи что тебе вывело
    try:
        client = await tdesk.ToTelethon(session=path, proxy=proxy, auto_reconnect=False)
        task1 = loop.create_task(client.connect())
        await asyncio.wait_for(task1, timeout=5)
    except Exception as e:
        print(f"An error occurred: {e}")
    finally:
        if client.is_connected():
            await client.disconnect()
  • Как сформировать условие для проверки сокета в JS?

    Lapita12
    @Lapita12
    $("#wrappelLine").on("focusout", "#extLineSipProxy", function () {
        var text = $(this).val();
        var id = $(this).attr("id");
    
        var parts = text.split(':');
        var ipOrDns = parts[0];
        var port = parts[1];
    
        var reg = /^(([0-9]{1,4})|([1-5][0-9]{4})|(6[0-4][0-9]{3})|(65[0-4][0-9]{2})|(655[0-2][0-9])|(6553[0-5]))$/;
        if (!reg.test(port) && $.trim(port) != "") {
            alert("Неверное значение порта.\nВы должны выбрать порт из данного диапазона:\n0-65535.");
            return 0;
        }
    
        $(this).replaceWith('<div class="EXL_MAIN_SIP_C3TCRRInp1" id="' + id + '">' + text + '</div>');
        $("#" + id).focus();
    });
    $("#wrappelLine").on("focusout", "#extLineSipProxy", function () {
        var text = $(this).val();
        var id = $(this).attr("id");
    
        $(this).replaceWith('<div class="EXL_MAIN_SIP_C3TCRRInp1" id="' + id + '">' + text + '</div>');
    
    });
    
    $("#wrappelLine").on("dblclick", "#extLineSipPort", function () {
        var text = $(this).text();
        var id = $(this).attr("id");
        $(this).replaceWith('<input type="text" class="EXL_MAIN_SIP_C3TCRRInpSh1" maxlength="5" id="' + id + '" value="' + text + '" />');
        $("#" + id).focus();
    });
    $("#wrappelLine").on("focusout", "#extLineSipPort", function () {
        var text = $(this).val();
        var id = $(this).attr("id");
        var reg = /^(([0-9]{1,4})|([1-5][0-9]{4})|(6[0-4][0-9]{3})|(65[0-4][0-9]{2})|(655[0-2][0-9])|(6553[0-5]))$/;
        if (!reg.test(text) && $.trim(text) != "") {
            alert("Неверное значение порта.\nВы должны выбрать порт из данного диапазона:\n0-65535.");
            //            $(this).focus();
            return 0;
        }
        if ($.trim(text.replace(/[",']/g, '')) == "" && $.trim(text) != "") {
            alert("Введите Порт!");
            //            $(this).focus();
        } else {
            if ($.trim(text) == "") {
                text = 5060;
            }
            $(this).replaceWith('<div class="EXL_MAIN_SIP_C3TCRRInpSh1" id="' + id + '">' + text + '</div>');
            $("#extLineSipURI").attr("title", 'sip:' + $("#extLineSipLogin").text() + '@' + $("#extLineSipHost").text() + ':' + text);
        }
    });
  • Sortable.min.js или как убить нервную систему в 0?

    Lapita12
    @Lapita12
    После выполнения AJAX-запроса не обновляется структура данных для плагина Sortable. Вам нужно повторно вызывать функцию applySortable после того, как контент добавляется через AJAX. Если поафколупиваться изменять ваш код, можете попробовать следующий вариант:

    $(document).ajaxSuccess(function () {
            var f0dChildren = $('#f0_d_');
            var fotosRElems = $('[id^="fotos-r"]');
            var sortableOptions = {
                animation: 150,
                handle: '.click_red, [class^="tab-ds f_"]',
            };
        
            function applySortable(elements, options) {
                elements.each(function () {
                    new Sortable(this, options);
                });
            }
        
            applySortable(f0dChildren, sortableOptions);
            applySortable(fotosRElems, sortableOptions);
        });
        
        $(document).on('content-loaded', function () {
            // Вызывайте applySortable после добавления контента через AJAX
            applySortable($('#f0_d_'), sortableOptions);
            applySortable($('[id^="fotos-r"]'), sortableOptions);
        });


    При добавлении контента через AJAX возведите событие 'content-loaded':

    $(document).trigger('content-loaded');
  • Как сгенерировать уникальный номер заказа примерно как у Бургер кинга?

    Lapita12
    @Lapita12
    Альберт Ушаков

    1. Создай функцию для генерации уникального номера заказа. Эта функция будет принимать две буквы (филиал и тип заказа) и числовой номер заказа.

    function generateOrderNumber(branch, orderType, number) {
      return `${branch}-${orderType}-${number}`;
    }


    2. Для работы с базой данных PostgreSQL используй библиотеку node-postgres Установи её

    npm install pg

    3. Создай таблицу в базе данных PostgreSQL для хранения информации о заказах, включая уникальный номер заказа, филиал, тип заказа и дату создания заказа.

    CREATE TABLE orders (
      id SERIAL PRIMARY KEY,
      order_number VARCHAR(255) UNIQUE NOT NULL,
      branch CHAR(1) NOT NULL,
      order_type CHAR(1) NOT NULL,
      created_at TIMESTAMP NOT NULL
    );


    4. Создай функцию для добавления нового заказа в базу данных. Эта функция будет использовать функцию генерации уникального номера заказа и добавлять запись в таблицу orders

    const { Pool } = require('pg');
    
    const pool = new Pool({
      // Ваши настройки подключения к базе данных
    });
    
    async function addOrder(branch, orderType) {
      const client = await pool.connect();
      try {
        await client.query('BEGIN');
        const { rows } = await client.query('SELECT COUNT(*) as count FROM orders WHERE created_at >= CURRENT_DATE');
        const orderNumber = generateOrderNumber(branch, orderType, parseInt(rows[0].count) + 1);
        await client.query('INSERT INTO orders (order_number, branch, order_type, created_at) VALUES ($1, $2, $3, NOW())', [orderNumber, branch, orderType]);
        await client.query('COMMIT');
        return orderNumber;
      } catch (error) {
        await client.query('ROLLBACK');
        throw error;
      } finally {
        client.release();
      }
    }


    5. Используй функцию addOrder для добавления новых заказов в базу данных. Уникальный номер заказа будет сгенерирован автоматически, и счетчик числового номера заказа будет сбрасываться каждый день.

    (async () => {
      try {
        const orderNumber = await addOrder('Y', 'A');
        console.log('Уникальный номер заказа:', orderNumber);
      } catch (error) {
        console.error('Ошибка при добавлении заказа:', error);
      }
    })();


    Это создаст уникальный номер заказа в формате YA-50, Счетчик числового номера заказа будет сбрасываться каждый день автоматически благодаря условию WHERE created_at >= CURRENT_DATE в запросе к базе данных.
  • Отображение блока в самом низу?

    Lapita12
    @Lapita12
    Артем Гартунг,
    async function elUp(selector) {
      try {
        var html = await (await fetch(location.href)).text();
        var newdoc = new DOMParser().parseFromString(html, 'text/html');
        var chat = document.querySelector(selector);
        chat.outerHTML = newdoc.querySelector(selector).outerHTML;
        
        chat = document.querySelector(selector);
        chat.scrollTop = chat.scrollHeight;
    
        return true;
      } catch(err) {return false;}
    }
  • Как добавить кнопку отмены действия в telegram боте?

    Lapita12
    @Lapita12
    from aiogram import Bot, Dispatcher, types
    from aiogram.contrib.middlewares.logging import LoggingMiddleware
    from aiogram.types import ParseMode
    from aiogram.utils import executor
    
    API_TOKEN = 'YOUR_BOT_TOKEN'
    admin_id = 'YOUR_ADMIN_ID'
    
    bot = Bot(token=API_TOKEN)
    dp = Dispatcher(bot)
    dp.middleware.setup(LoggingMiddleware())
    
    support_enabled = True
    
    @dp.message_handler(commands=['help'])
    async def process_start_command(message: types.Message):
        if message['from'].id == admin_id:
            await message.answer(f"Hi, admin")
        else:
            keyboard = types.ReplyKeyboardMarkup(resize_keyboard=True)
            cancel_button = types.KeyboardButton(text="Отмена")
            keyboard.add(cancel_button)
            await message.answer(f"Привет! Если у тебя есть предложение или идея - напиши мне!", reply_markup=keyboard)
    
    @dp.message_handler(lambda message: message.text == 'Отмена')
    async def process_cancel_support(message: types.Message):
        global support_enabled
        support_enabled = False
        await message.answer("Техническая поддержка отменена.")
    
    @dp.message_handler(content_types=['text'])
    async def process_start_command(message: types.Message):
        global support_enabled
        if support_enabled:
            if message.reply_to_message == None:
                if '/start' not in message.text and message.text != 'Отмена':
                    await bot.forward_message(admin_id, message.from_user.id, message.message_id)
                    await message.answer('Спасибо за сообщение!!')
            else:
                if message['from'].id == admin_id:
                    if message.reply_to_message.forward_from.id:
                        await bot.send_message(message.reply_to_message.forward_from.id, message.text)
                else:
                    await message.answer('На сообщения нельзя отвечать!')
        else:
            await message.answer('Техническая поддержка отключена.')
    
    if __name__ == '__main__':
        from aiogram import executor
        executor.start_polling(dp, skip_updates=True)
  • Как НЕ выполнять условие при таче по UI элементам?

    Lapita12
    @Lapita12
    Или попробуйте код ниже
    void Update()
    {
        if (canExecute && (Input.GetMouseButtonDown(0) || Input.GetKeyDown(KeyCode.Space)) && !IsPointerOverUIObject() && !endGame)
        {
            canExecute = false;
            cooldownTimer = cooldownDuration;
    
            Vector3 mousePosition = Camera.main.ScreenToWorldPoint(Input.mousePosition);
            directionKnife = mousePosition;
            mousePosition.z = 0f;
            GameObject knife = Instantiate(knifePrefab, mousePosition, Quaternion.identity);
    
            StartCoroutine(RotateKnife(knife));
        }
    }
    
    bool IsPointerOverUIObject()
    {
        #if UNITY_EDITOR || UNITY_STANDALONE || UNITY_WEBGL
            return EventSystem.current.IsPointerOverGameObject();
        #elif UNITY_ANDROID || UNITY_IOS
            if (Input.touchCount > 0)
            {
                Touch touch = Input.GetTouch(0);
                PointerEventData eventData = new PointerEventData(EventSystem.current);
                eventData.position = touch.position;
                List<RaycastResult> results = new List<RaycastResult>();
                EventSystem.current.RaycastAll(eventData, results);
                return results.Count > 0;
            }
            return false;
        #endif
    }
  • Как НЕ выполнять условие при таче по UI элементам?

    Lapita12
    @Lapita12
    Александр Андропов,
    void Update()
    {
        bool isOverUI = false;
    
        if (Application.platform == RuntimePlatform.Android || Application.platform == RuntimePlatform.IPhonePlayer)
        {
            if (Input.touchCount > 0)
            {
                int pointerId = Input.touches[0].fingerId;
                isOverUI = EventSystem.current.IsPointerOverGameObject(pointerId);
            }
        }
        else
        {
            isOverUI = EventSystem.current.IsPointerOverGameObject();
        }
    
        if (canExecute && (Input.GetMouseButtonDown(0) || Input.GetKeyDown(KeyCode.Space)) && !isOverUI && !endGame)
        {
            canExecute = false;
            cooldownTimer = cooldownDuration;
    
            Vector3 mousePosition = Camera.main.ScreenToWorldPoint(Input.mousePosition);
            directionKnife = mousePosition;
            mousePosition.z = 0f;
            GameObject knife = Instantiate(knifePrefab, mousePosition, Quaternion.identity);
    
            StartCoroutine(RotateKnife(knife));
        }
    }
  • В чем разница между сервлетом и контроллером?

    Lapita12
    @Lapita12
    OldJohn, Ваши выражения в основном верны, но позвольте мне разъяснить их еще немного:

    Сервлеты и контроллеры оба обрабатывают HTTP-запросы, но на разных уровнях абстракции и в разных контекстах.

    Сервлет - это низкоуровневый компонент Java EE, который обрабатывает HTTP-запросы, разбирает заголовки и формирует HTTP-ответы. Сервлеты предоставляют базовую функциональность для обработки запросов, но обычно требуют больше кода для управления деталями и состоянием сессии.

    Контроллер - это более высокоуровневая абстракция, которая использует архитектуру MVC и фреймворки, такие как Spring MVC. Контроллеры определяют логику обработки запросов и определяют, какие данные должны быть получены из модели и какие представления (view) должны быть отображены. Контроллеры упрощают и структурируют обработку запросов, предоставляя аннотации и соглашения для определения обработчиков запросов.

    Cервлеты и контроллеры имеют разные цели и уровни абстракции, хотя оба обрабатывают HTTP-запросы. Сервлеты фокусируются на непосредственной обработке HTTP-запросов, а контроллеры организуют логику обработки запросов в контексте архитектуры MVC и фреймворков.