diff --git a/.gitignore b/.gitignore
index 4f4773f..30839ad 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1 +1,25 @@
config.php
+.env
+uploads/*
+!uploads/.gitkeep
+*.log
+logs/
+*.tmp
+*.temp
+*.swp
+*.swo
+*~
+.vscode/
+.idea/
+*.sublime-*
+.DS_Store
+Thumbs.db
+desktop.ini
+docker-compose.override.yml
+*.sql
+*.db
+cache/
+tmp/
+sessions/
+*.bak
+*.backup
diff --git a/AnonymousID.php b/AnonymousID.php
new file mode 100644
index 0000000..0cef1b2
--- /dev/null
+++ b/AnonymousID.php
@@ -0,0 +1,50 @@
+db = $db;
+ $this->ip = $ip;
+ $this->boardId = $boardId;
+ }
+
+ public function getOrCreateID() {
+ $stmt = $this->db->prepare('
+ SELECT anonymous_id FROM posts
+ WHERE ip_address = ? AND board_id = ?
+ ORDER BY created_at DESC
+ LIMIT 1
+ ');
+ $stmt->execute([$this->ip, $this->boardId]);
+ $existingId = $stmt->fetchColumn();
+
+ if ($existingId) {
+ return $existingId;
+ }
+
+ return $this->generateNewID();
+ }
+
+ private function generateNewID() {
+ return 'ID:' . sprintf('%06d', mt_rand(1, 999999));
+ }
+
+ public function getIDForThread() {
+ $stmt = $this->db->prepare('
+ SELECT anonymous_id FROM threads
+ WHERE ip_address = ? AND board_id = ?
+ ORDER BY created_at DESC
+ LIMIT 1
+ ');
+ $stmt->execute([$this->ip, $this->boardId]);
+ $existingId = $stmt->fetchColumn();
+
+ if ($existingId) {
+ return $existingId;
+ }
+
+ return $this->generateNewID();
+ }
+}
\ No newline at end of file
diff --git a/MarkdownParser.php b/MarkdownParser.php
new file mode 100644
index 0000000..213d209
--- /dev/null
+++ b/MarkdownParser.php
@@ -0,0 +1,17 @@
+>(\d{6})/', '$1', $text);
+ $text = preg_replace('/`(.*?)`/', '$1
', $text);
+ $text = preg_replace('/\[([^\]]+)\]\(([^)]+)\)/', '$1', $text);
+ $text = preg_replace('/^\* (.+)$/m', '
**жирный**
- жирный текст*курсив*
- курсив_подчеркнутый_
- подчеркнутый~~зачеркнутый~~
- зачеркнутый`код`
- код>>123456
- ссылка на пост[текст](url)
- ссылка* элемент
- список