21

Re: Класс для роботи sqlite подивіться будьласка.

Пан ur_naz цілком слушно, хоча й, як зазвичай, різко каже, що в таких випадках перед тим, як кодити, бажано хоча б умовно намалювати схему стосунків між сутностями - можна UML, можна навмання, від душі.

22

Re: Класс для роботи sqlite подивіться будьласка.

koala написав:

Пан ur_naz цілком слушно, хоча й, як зазвичай, різко каже, що в таких випадках перед тим, як кодити, бажано хоча б умовно намалювати схему стосунків між сутностями - можна UML, можна навмання, від душі.

Я й не казав що він каже не слушно просто по просив пояснити.

23

Re: Класс для роботи sqlite подивіться будьласка.

нащо мені вам пояснювати, якщо доречно було б вам пояснити що у вас коїться в вашому коді
наприклад:
# мабуть є якась глобальна змінна, яка зберігає гру... глобальні змінні то зло...
game = get_game()

# клас месдж, в якому клас from_user, в якому клас id... це взагалі що?
message.from_user.id

от таке я можу зрозуміти
user = game.get_user_by_message (message)

# не розумію
reply = user.start_game()
# розумію
game_status  = game.start(users_ids)
# не розумію
bot.send_message(message.chat.id, reply)
#розумію хто що куди
bot.send_message(message, chat_id)

Подякували: plusxx1

24

Re: Класс для роботи sqlite подивіться будьласка.

ur_naz написав:

нащо мені вам пояснювати, якщо доречно було б вам пояснити що у вас коїться в вашому коді
наприклад:
# мабуть є якась глобальна змінна, яка зберігає гру... глобальні змінні то зло...
game = get_game()

Ну логічно ж - якщо викликають функцію, то це точно глобальна змінна! Баз даних, файлів конфігурацій, статики і сінглтонів не існує! Чи ви просто про них не чули?

ur_naz написав:

# клас месдж, в якому клас from_user, в якому клас id... це взагалі що?
message.from_user.id
от таке я можу зрозуміти
user = game.get_user_by_message (message)

Серйозно? Тобто те, що ми витягаємо id з повідомлення через інтерфейс, наданий Telegram, і запитуємо цей id в моделі - це погано; а якщо ми моделі передаємо все повідомлення Telegram, то це ви зрозумієте? Модель, на вашу думку, має залежати від усіх можливих інтерфейсів? Що до проєктування інтерфейсу звертайтеся до розробників Telegram, і - підкажу - їх тут немає.

ur_naz написав:

# не розумію
reply = user.start_game()
# розумію
game_status  = game.start(users_ids)

Це вже залежить від реалізації game та user. Чи має user знати, до якої game він належить? Чи буде там один id чи декілька? Це все - питання до моделі. Головне тут - ми передали моделі дані (коли створювали user), а тепер отримуємо від неї реакцію.

ur_naz написав:

# не розумію
bot.send_message(message.chat.id, reply)
#розумію хто що куди
bot.send_message(message, chat_id)

WHAAAT? Ви не бачите, що message - то повідомлення, яке ми отримали, а message.chat.id - це id з того повідомлення? Що саме ви відправляєте оцим своїм, що "розумієте" - те ж повідомлення, що прийшло, назад?

Подякували: plusxx1

25

Re: Класс для роботи sqlite подивіться будьласка.

по-перше, вклинюватися в чужу розмову то є невихована поведінка.
по-друге, ви навіть не можете зрозуміти, що самі відповіли на своє "питання". але так і не зрозуміли, що не так. і так далі.
і на останнє, я бачу, що месдж є об'єкт. і я дуже сумніваюсь що паша дуров розробив свій телеграм так, щоб передавати об'єкти через інет. це занадто повільно

Подякували: plusxx1

26 Востаннє редагувалося koala (27.12.2019 15:59:38)

Re: Класс для роботи sqlite подивіться будьласка.

ur_naz написав:

по-перше, вклинюватися в чужу розмову то є невихована поведінка.

Яким чином я "вклинююся в чужу розмову", коли ви обговорюєте виключно мій код?

ur_naz написав:

по-друге, ви навіть не можете зрозуміти, що самі відповіли на своє "питання". але так і не зрозуміли, що не так. і так далі.

Я поставив кілька питань. Багато з них - риторичні. Уточнюйте, що ви маєте на увазі. І так далі.

ur_naz написав:

і на останнє, я бачу, що месдж є об'єкт. і я дуже сумніваюсь що паша дуров розробив свій телеграм так, щоб передавати об'єкти через інет. це занадто повільно

Із цього місця можна детальніше - що ви маєте на увазі під "передачею об'єктів через мережу"? З вихідним кодом методів, чи що? Очевидно, що це не так - Python-об'єкти збираються з повідомлень якось бібліотекою. Але конкретно message може бути, і швидше за все і є, JSONом чи якиймось інший PODом, але в будь-якому разі це щось іменоване і ієрархічне.

Подякували: plusxx1

27 Востаннє редагувалося plusxx (27.12.2019 15:58:17)

Re: Класс для роботи sqlite подивіться будьласка.

ur_naz написав:

по-перше, вклинюватися в чужу розмову то є невихована поведінка.
по-друге, ви навіть не можете зрозуміти, що самі відповіли на своє "питання". але так і не зрозуміли, що не так. і так далі.
і на останнє, я бачу, що месдж є об'єкт. і я дуже сумніваюсь що паша дуров розробив свій телеграм так, щоб передавати об'єкти через інет. це занадто повільно

Подяку додав випадково
.

Ви напевно краще від мене розбираєтесь  в програмуванні , але хочу вам сказати що ви нестикались з бібліотекою pyTelegramBotAPI інакше половина з ваших питань відпалаб сама.  Далі на то він і форум щоб вклинюватись . 
Далі вам вдячний за хороше питання як телеграм передає інформацію. Сьогодні ж попробую дізнатись на нього відповідь. Хоча дійсно недумаю що в вигляді об'єктів. Об'єкти є частиною бібліотеки для роботи зтелеграм ботами. З об'єкту message можна дізнатись як id користувача котрий прислав повідомлення , так і сам текст повідомлення, мовні налаштування його клієнта і тп.

28 Востаннє редагувалося ur_naz (27.12.2019 16:02:18)

Re: Класс для роботи sqlite подивіться будьласка.

якщо бібліотека працює через дупу, то краще написати свою, аніж використовувати її. Або коментувати код, щоб він був зрозумілий, бо незрозумілий код, то ненадійний код і працює він гірше, якщо взагалі працює

29

Re: Класс для роботи sqlite подивіться будьласка.

ur_naz написав:

якщо цей код ваш, думайте, чому він незрозумілий іншим. а якщо це ваш другий акк, то може вам до психіатра?. Ідеальний код (чи може ви неуважно читали) не провокує здивування.

Здивування - це особиста реакція. У людини, що в житті не бачила програм, будь-який код викличе здивування. От і ви себе так поводите.

30

Re: Класс для роботи sqlite подивіться будьласка.

ur_naz написав:

якщо бібліотека працює через дупу, то краще написати свою, аніж використовувати її

Не поділитеся своєю бібліотекою для підсвітлення коду на цьому сайті? Бо тут вона працює явно через дупу, а ви з такими принципами вже явно написали свою.

31

Re: Класс для роботи sqlite подивіться будьласка.

у людини що взагалі не бачила людей може бути таке в голові таке неподобство, обсмоктувати інших, не знаючи про них нічого. ви маєте лише зверхнє враження, а оцінюєте ніби в вас замість очей мікроскопи. не соромно вам,  ви ж обіцяли виправитися

32

Re: Класс для роботи sqlite подивіться будьласка.

ur_naz написав:

# не розумію
bot.send_message(message.chat.id, reply)

Це означає що бот має відповісти користувачу котрий прислав йому повідомлення.
То придумав не я а Паша Дуров ну або його корєшки.

З вас могорич я вам рейт нашару піднімаю.

33

Re: Класс для роботи sqlite подивіться будьласка.

ur_naz написав:

у людини що взагалі не бачила людей може бути таке в голові таке неподобство, обсмоктувати інших, не знаючи про них нічого. ви маєте лише зверхнє враження, а оцінюєте ніби в вас замість очей мікроскопи. не соромно вам,  ви ж обіцяли виправитися

Радий, що ви нарешті зрозуміли, як ваші повідомлення виглядають з точки зору інших учасників форуму; але раджу надалі самокритику не викладати на загальний огляд. Звісно, нічого поганого в цьому немає, але ефект виходить дещо... гм... комедійний.

34

Re: Класс для роботи sqlite подивіться будьласка.

як писати на форумі то одне, як ставитися одне до одного то є друге, а як писати код то є взагалі інша історія

35

Re: Класс для роботи sqlite подивіться будьласка.

pluszz написав:
koala написав:
Прихований текст

Далі - код не буває "адекватним" сам по собі; він може бути адекватним певним обставинам, а ви про ці обставини ніц не написали. Наприклад, якщо вся програма - це скриптик на колінці на 10 рядків, а задля нього ви створюєте такий клас - він, схоже, буде неадекватним. Так само якщо у вас є чітко виділений бізнес-код з певними вимогами до адаптера БД, він може бути неадекватним цим вимогам, але ж ви про це нічого не пишете.
Наступне питання - структура БД у вас неадекватна усім розумним вимогам до БД. Ви, як я зрозумів, замість зберігати однотипні дані в одній  таблиці, створюєте різні таблиці з однаковою структурою. Нащо ви це робите?

А тепер  по коду:
- що за назва "SQLighte"? Що вона означає? Просто випадковий набір символів, що, на вашу думку, має вимовлятися співзвучно з назвою БД? Назви мають відповідати змісту.
- про структуру БД вже писав;
- якщо CREATE впаде з іншої причини - наприклад, через втрату зв'язку, то чи це буде оброблено коректно? До речі, мануал каже, що коли таблиця вже існує, то це буде ProgrammingError. Коментар не відповідає реальності, помилка обробляється косо-криво.
- deleted_table - це минулий час. Функція перевіряє, чи було таблицю видалено? Ні. Назва має відповідати дії. До речі, ви пишете то "юзер", то "таблиця". Визначиться з термінологією - або ви працюєте в термінах вашої програми (тоді "юзер"), або в термінах БД (тоді "таблиця"), або ви робите перехідник-адаптер з однієї термінології на іншу, тоді в назвах функцій має бути внутрішня термінологія програми, а всередині функцій - зовнішня термінологія БД.
- select_single - ви певні, що знаєте, що саме робить with? Вам точно треба закривати з'єднання після виконання цієї функції?
А ще ви в курсі, як працює for у Python? Що range - це костиль для перебору чисел, спеціально введений, щоб списки так не перебирали? Елементи data точно правильного розміру, може, варто було б передавати не tuple-и, а якісь структури з внутрішньої логіки? А якщо правильного, то нащо ви розбираєте data[number] на шматки, з яких збираєте новий tuple? Ваш код можна записати так:
for sample in data:
    self.cursor.execute(f"INSERT INTO {self.table_name} Values(?,?,?,?,?,?,?,?)", sample)
і це - за умови, що return ви поставили неправильно, бо якщо правильно, то вам цикл взагалі не потрібен, він же лише один раз виконається.
Але це теж не дуже правильно, бо SQLite має також функцію executemany, що дозволяє взагалі уникнути циклу (точніше, вона сама містить цей цикл з додатковими оптимізаціями).

except IndexError & sqlite3.OperationalError:

Будь ласка, відкрийте підручник і прочитайте, що там написано. Або погугліть.

Вдячний за розвернути відповідь прийму до уваги і виправлю.
P.S. Це не бізнес код але і не скриптик на 10 рядків.
Я не проф і навіть без освіти тому мене важко образити. Всю критику приймаю позитивно.

36

Re: Класс для роботи sqlite подивіться будьласка.

щось я не розумію, чий код?

Подякували: plusxx1

37 Востаннє редагувалося plusxx (27.12.2019 22:39:54)

Re: Класс для роботи sqlite подивіться будьласка.

ur_naz написав:

щось я не розумію, чий код?

Я вас знов не спеціально лайкнув. Просто з телефона незручно було. Замість "Цитата" натиснув подякувати


Просто той кусок коду котрий ви почали розбирати, запропонував пан koala замість мого

@bot.message_handler(commands=["start"])
def reply_to_start_message(message):#Функція запускається по команді /start
    db = DataBaseFunctional(str(message.from_user.id), "users.db")
    if db.create_table()==True:#Якщо функція create_table повертає тру це значить що створено нов утаблицю в базі данних для користувача
        db.write_starting_data_to_table(start_data)#Запис початкових значень  до таблиці
        print (f"created database to user id {message.from_user.id}")
        bot.send_message(message.chat.id, f"Привіт {message.from_user.username}. Ти ввійшов в гру ...все має наслідки",reply_markup=keyboard.keyboard0)#Перше ігрове повідомлення
    else:#Якщо функція create_table повертає false значить користувач вже є в базі
        bot.send_message(message.chat.id, f"Привіт {message.from_user.username} продовжимо гру")

його варіант мені більше сподобався.

38

Re: Класс для роботи sqlite подивіться будьласка.

import telebot
from config import token
from config import admin_id
from data_base import DatabaseManagementFunctional
from keyboards import KeyboardsForBot as keyboard
from data_to_create_pers import start_data
from gameplay_management import GamePlayManagement

bot = telebot.TeleBot(token)
@bot.message_handler(commands=["start"])
def reply_to_start_message(message):#Функція запускається по команді /start
    try:
        gmp=GamePlayManagement(message)
        gmp.create_new_user()
        bot.send_message(message.from_user.id, f"Привіт {message.from_user.username}. Ти ввійшов в гру ...все має наслідки. Трам пам пам. Сервісні команди гри /start - запускає гру, /delete_game - видаляє гру /restart_game - перезупускає гру",reply_markup=keyboard.keyboard0)
    except Exception as e:
        print('reply_to_start_message failed:', str(e))
        bot.send_message(admin_id, str(e), str(message.from_user.id))#Відправляє помилку в адміністратору
        bot.send_message(message.from_user.id, 'Щось пішло не так, ми вже працюємо над цим')

@bot.message_handler(commands=["delete_game"])
def delete_any_game(message):#Видалення ігровоих данних
    try:
        gmp=GamePlayManagement(message)
        gmp.delete_any_user_progres()
        bot.send_message(message.from_user.id, f"{message.from_user.username} Ваш ігровий прогрес видалено ")
    except Exception as e:
        print('delete_any_game failed:', str(e))
        bot.send_message(admin_id, str(e), str(message.from_user.id))#Відправляє помилку в адміністратору
        bot.send_message(message.chat.id, "Вибачте. Запис невдалося видалити або запис з вашими даними не був знайдений")

@bot.message_handler(commands=["restart_game"])
def restart_game(message):#Рестарт гри
    try:
        delete_any_game(message)
        reply_to_start_message(message)
        bot.send_message(message.from_user.id, f"{message.from_user.username} ваш гра перезапущена.")
        print(f'user id {message.from_user.id} restarted game')
    except Exception as e:
        print('delete_any_game failed:', str(e))
        bot.send_message(admin_id, str(e), str(message.from_user.id))#Відправляє помилку в адміністратору
        bot.send_message(message.from_user.id, "Вибачте. Не вдалося зробити рестарт, ми працюємо над цим ")

@bot.message_handler(content_types=["text"])
def repeat_all_messages(message): # Обробка текстових повідомленнь
    try:
        gpm = GamePlayManagement(message)
        bot.send_message(message.from_user.id, gpm.message_hub())
    except Exception as e:
        print('reply_to_start_message failed:', str(e))
        bot.send_message(admin_id, str(e), str(message.from_user.id))#Відправляє помилку в адміністратору
        bot.send_message(message.from_user.id, 'Щось пішло не так, ми вже працюємо над цим')


if __name__== '__main__':
    bot.polling(none_stop = True)
    print("start long polling")

Переробив  то так щоб внутрішня логіка ніяк не залежала від інтерфейса телеграма . Всі виклики та запити будуть в  классі GamePlayManagement.

Подякували: koala1

39 Востаннє редагувалося ur_naz (28.12.2019 01:20:14)

Re: Класс для роботи sqlite подивіться будьласка.

так, я перепрошую, мабуть я проскролив сторінку занадто, але це не відміняє мої слова.
якщо в вас якась гра, так і назвіть свій клас - гра така-то, конструктор, де потрібно створити таблицю. метод для додавання гравців у контейнер, метод що формує команди гравців, якщо потрібно. метод що запускає процес гри... деструктор що вивільняє ресурси, тощо

Подякували: koala, plusxx2

40

Re: Класс для роботи sqlite подивіться будьласка.

ur_naz написав:

так, я перепрошую, мабуть я проскролив сторінку занадто, але це не відміняє мої слова.
якщо в вас якась гра, так і назвіть свій клас - гра така-то, конструктор, де потрібно створити таблицю. метод для додавання гравців у контейнер, метод що формує команди гравців, якщо потрібно. метод що запускає процес гри... деструктор що вивільняє ресурси, тощо

Брак досвіду і навичок заставляє все робити спочатку через одне місце.