Это был типичный подмосковный ЖК, коих сотни. Именно в таком ЖК произошла история, описанная в этой статье. В конце написал что есть еще некоторые идеи и вот руки дошли и до одной из них.
Все мы знаем что домах 1.5 тыс. домов довольно важно иметь хоть какой-то справочник по квартирам для быстрой связи с собственниками или проживающими. Обычно это exel табличка в виде НОМЕР КВ. - НОМЕР. Но у нас есть бот всеобъемлющий все чаты ЖК, поэтому я решил пойти своим путем.
Для начала я подумал какие данные можно собрать, а какие наверное не стоит. Учитывая что имена и номера - это конфиденциальные данные человека, которые я не имею права хранить, формат хранения такой:
дом-секция-этаж-квартира-имя-id-авто
где:
Имя - ник или при его отсутствии имя в телеграмме. Благо python любезно может реализовывать такие логические выражения очень просто. Также нужно учесть что многие пользователи телеграмма не заполняют поле last_name и просто оставляют его пустым. в таком случае будет передаваться None. Учитывая все вышеперечисленные проблемы я рекомендую использовать вот такой формат:
call.message.reply_to_message.from_user.username or (str(call.message.reply_to_message.from_user.first_name) + " " + str(call.message.reply_to_message.from_user.last_name or ""))
Авто - номер автомобиля. Он должен быть на последнем месте потому что его может быть просто не быть. Почему это должно быть так я расскажу позже и постараюсь объяснить почему я реализовал это именно так. Но скорее всего получу гору осуждения по поводу. Проверку правильности ввода номера я делаю при помощи обычной регулярки, которую написал сам, т.к. на просторах интернета мне не очень зашли варианты:
"^[а-яА-ЯёЁ][0-9]{3}[а-яА-ЯёЁ]{2}[0-9]+$"
А теперь к решению вопроса о хранении всего этого добра. Я решил не использовать реляционные БД просто потому что она мне в целом не нужна + мне довольно сложно не имея соответствующего опыта разворачивать сервер БД без графического интерфейса. Поэтому я сделал просто txt файл и храню данные именно в таком формате как я указал выше. данные разделяю по порядку через "-". Работает быстро, записывает быстро. Но есть момент. приходится при изменении данных удалять предыдущую строку, двигать весь список вверх на -1 от текущей позиции курсора в файле и записывать снова всё что было ниже + строку, измененную пользователем.
def edit_user(self, call):
for i in self.coincidences:
self.lines.pop(i[1])
with open("chess_neighbors.txt", "w") as file:
for text_str in self.lines:
file.write(text_str)
self.add_user(call)
не сложно, но не красиво. Однако работает.
Формат взаимодействия пользователя с шахматкой такой:
т.е. просто перечисляем цифрами дом секцию этаж квартиру через пробел с командой /шахматка в ответ на сообщение нужного пользователя, а уже их его сообщения берем id имя usera.
Интерфейс поиска имеет несколько вариантов:
а также по номеру авто соответственно /найти м000мм000 например.
К сожалению люди неохотно отмечаются в своих квартирах. Но админы потихоньку заполняют данные. И более неохотнее отмечают номер своих авто. Возможно в будущем мы соберем достаточно данных чтоб закрыть чаты домов для неотмеченных пользователей... но это уже совсем другая история.