diff --git a/boards/abstracts/settingsmanager.py b/boards/abstracts/settingsmanager.py
--- a/boards/abstracts/settingsmanager.py
+++ b/boards/abstracts/settingsmanager.py
@@ -1,7 +1,12 @@
import uuid
-from django.shortcuts import get_object_or_404
+
+import boards
+from boards.abstracts.tripcode import Tripcode
+
from boards.models import Tag
+MAX_TRIPCODE_COLLISIONS = 50
+
__author__ = 'neko259'
SESSION_SETTING = 'setting'
@@ -119,10 +124,25 @@ class SettingsManager:
self.set_setting(SETTING_HIDDEN_TAGS, tags)
def get_tripcode(self):
- return self.get_setting(SETTING_TRIPCODE, str(uuid.uuid4()))
+ tripcode = self.get_setting(SETTING_TRIPCODE)
+ if tripcode is None:
+ self.reset_tripcode()
+ tripcode = self.get_setting(SETTING_TRIPCODE)
+ return tripcode
def reset_tripcode(self):
- self.set_setting(SETTING_TRIPCODE, str(uuid.uuid4()))
+ tripcode = Tripcode(str(uuid.uuid4()))
+
+ # If we cannot find a collision-free tripcode, then let the collision
+ # be destiny
+ collision_counter = 0
+ while boards.models.Post.objects.filter(
+ tripcode__startswith=tripcode.get_short_text()).exists()\
+ and collision_counter < MAX_TRIPCODE_COLLISIONS:
+ tripcode = Tripcode(str(uuid.uuid4()))
+ collision_counter += 1
+ print('Tripcode collision detected') # FIXME Use proper logging
+ self.set_setting(SETTING_TRIPCODE, tripcode.get_full_text())
class SessionSettingsManager(SettingsManager):
diff --git a/boards/abstracts/tripcode.py b/boards/abstracts/tripcode.py
--- a/boards/abstracts/tripcode.py
+++ b/boards/abstracts/tripcode.py
@@ -21,7 +21,10 @@ class Tripcode:
def get_short_text(self):
return self.tripcode[:8]
+ def get_full_text(self):
+ return self.tripcode
+
def get_view(self):
- return '{}'\
- .format(self.get_color(), self.get_background(),
- self.get_short_text())
\ No newline at end of file
+ return '{}'\
+ .format(self.get_full_text(), self.get_color(), self.get_background(),
+ self.get_short_text())