Files
django-discord/chat/models.py
T
biggy 88bdfc797b feat(voice): add WebRTC voice channels with Cloudflare TURN support
Add voice channel functionality with WebRTC peer-to-peer audio:
- Add VoiceSignalingConsumer for WebRTC signaling and peer coordination
- Add GlobalConsumer for real-time presence and voice status updates
- Add voice channel type to Channel model with current_voice_channel tracking on UserProfile
- Add voice controls UI (mute, deafen, disconnect) in status panel
- Add voice member list display in sidebar with avatar support
- Add
2026-05-23 20:56:37 +02:00

73 lines
2.7 KiB
Python

from django.db import models
from django.contrib.auth.models import User
class UserProfile(models.Model):
ROLE_CHOICES = [
('admin', 'Administrator'),
('moderator', 'Moderator'),
('user', 'User'),
]
user = models.OneToOneField(User, on_delete=models.CASCADE, related_name='profile')
avatar = models.ImageField(upload_to='avatars/', null=True, blank=True)
bio = models.TextField(blank=True, default='')
role = models.CharField(max_length=20, choices=ROLE_CHOICES, default='user')
blocked_users = models.ManyToManyField(User, related_name='blocked_by', blank=True)
online = models.BooleanField(default=False)
current_voice_channel = models.ForeignKey('Channel', on_delete=models.SET_NULL, null=True, blank=True, related_name='voice_members')
def __str__(self):
return f'{self.user.username} ({self.role})'
def is_admin(self):
return self.role == 'admin'
def is_moderator(self):
return self.role in ('admin', 'moderator')
class Channel(models.Model):
CHANNEL_TYPES = [
('text', 'Text Channel'),
('voice', 'Voice Channel'),
]
name = models.CharField(max_length=100, unique=True)
description = models.TextField(blank=True, default='')
channel_type = models.CharField(max_length=10, choices=CHANNEL_TYPES, default='text')
created_by = models.ForeignKey(User, on_delete=models.SET_NULL, null=True, related_name='created_channels')
members = models.ManyToManyField(User, related_name='channels', blank=True)
created_at = models.DateTimeField(auto_now_add=True)
def __str__(self):
return f'#{self.name}'
class Message(models.Model):
channel = models.ForeignKey(Channel, on_delete=models.CASCADE, related_name='messages')
sender = models.ForeignKey(User, on_delete=models.CASCADE, related_name='messages')
content = models.TextField(blank=True, default='')
file = models.FileField(upload_to='uploads/', null=True, blank=True)
timestamp = models.DateTimeField(auto_now_add=True)
deleted = models.BooleanField(default=False)
class Meta:
ordering = ['timestamp']
def __str__(self):
return f'{self.sender.username}: {self.content[:50]}'
class DirectMessage(models.Model):
sender = models.ForeignKey(User, on_delete=models.CASCADE, related_name='sent_dms')
receiver = models.ForeignKey(User, on_delete=models.CASCADE, related_name='received_dms')
content = models.TextField(blank=True, default='')
file = models.FileField(upload_to='dm_uploads/', null=True, blank=True)
timestamp = models.DateTimeField(auto_now_add=True)
class Meta:
ordering = ['timestamp']
def __str__(self):
return f'DM {self.sender.username}{self.receiver.username}'