root
16 years ago
commit
646da21f74
21 changed files with 629 additions and 0 deletions
-
0dingenskirchen/mumble/__init__.py
-
BINdingenskirchen/mumble/__init__.pyc
-
18dingenskirchen/mumble/admin.py
-
BINdingenskirchen/mumble/admin.pyc
-
174dingenskirchen/mumble/mmobjects.py
-
BINdingenskirchen/mumble/mmobjects.pyc
-
157dingenskirchen/mumble/models.py
-
BINdingenskirchen/mumble/models.pyc
-
0dingenskirchen/mumble/templatetags/__init__.py
-
BINdingenskirchen/mumble/templatetags/__init__.pyc
-
16dingenskirchen/mumble/templatetags/mumble_extras.py
-
BINdingenskirchen/mumble/templatetags/mumble_extras.pyc
-
8dingenskirchen/mumble/urls.py
-
BINdingenskirchen/mumble/urls.pyc
-
115dingenskirchen/mumble/views.py
-
BINdingenskirchen/mumble/views.pyc
-
54template/mumble/content.htm
-
47template/mumble/content.htm.bak
-
10template/mumble/mumble.htm
-
29template/mumble/reg.htm
-
1template/mumble/style.htm
@ -0,0 +1,18 @@ |
|||
from dingenskirchen.mumble.models import * |
|||
from django.contrib import admin |
|||
|
|||
class MumbleAdmin(admin.ModelAdmin): |
|||
list_display = [ 'name', 'addr', 'port', 'booted' ]; |
|||
list_filter = [ 'booted' ]; |
|||
search_fields = [ 'name', 'addr' ]; |
|||
ordering = [ 'name' ]; |
|||
|
|||
class MumbleUserAdmin(admin.ModelAdmin): |
|||
list_display = [ 'owner', 'server', 'name' ]; |
|||
list_filter = [ 'server' ]; |
|||
search_fields = [ 'owner__username', 'name' ]; |
|||
ordering = [ 'owner__username' ]; |
|||
|
|||
|
|||
admin.site.register( Mumble, MumbleAdmin ); |
|||
admin.site.register( MumbleUser, MumbleUserAdmin ); |
@ -0,0 +1,174 @@ |
|||
import dbus |
|||
|
|||
import datetime |
|||
from time import time |
|||
|
|||
# base = ice.stringToProxy( "Meta:tcp -h 127.0.0.1 -p 6502" ); |
|||
# srv = Murmur.ServerPrx.checkedCast( base ); |
|||
# met = Murmur.MetaPrx.checkedCast( base ); |
|||
|
|||
class mmServer( object ): |
|||
# channels = dict(); |
|||
# players = dict(); |
|||
# id = int(); |
|||
# rootName = str(); |
|||
|
|||
def __init__( self, serverID, serverObj, rootName = '' ): |
|||
if not isinstance( serverObj, dbus.ProxyObject ): |
|||
raise Exception, "mmServer: I need the object returned by dbus.get_object!" |
|||
|
|||
self.dbusObj = serverObj; |
|||
self.channels = dict(); |
|||
self.players = dict(); |
|||
self.id = serverID; |
|||
self.rootName = rootName; |
|||
|
|||
links = dict(); |
|||
|
|||
for theChan in serverObj.getChannels(): |
|||
# Channels - Fields: 0 = ID, 1 = Name, 2 = Parent-ID, 3 = Links |
|||
|
|||
if( theChan[2] == -1 ): |
|||
# No parent |
|||
self.channels[theChan[0]] = mmChannel( theChan ); |
|||
else: |
|||
self.channels[theChan[0]] = mmChannel( theChan, self.channels[theChan[2]] ); |
|||
|
|||
# process links - if the linked channels are known, link; else save their ids to link later |
|||
for linked in theChan[3]: |
|||
if linked in self.channels: |
|||
self.channels[theChan[0]].linked.append( self.channels[linked] ); |
|||
else: |
|||
if linked not in links: |
|||
links[linked] = list(); |
|||
links[linked].append( self.channels[theChan[0]] ); |
|||
#print "Saving link: %s <- %s" % ( linked, self.channels[theChan[0]] ); |
|||
|
|||
# check if earlier round trips saved channel ids to be linked to the current channel |
|||
if theChan[0] in links: |
|||
for targetChan in links[theChan[0]]: |
|||
targetChan.linked.append( self.channels[theChan[0]] ); |
|||
|
|||
if self.rootName: |
|||
self.channels[0].name = self.rootName; |
|||
|
|||
for thePlayer in serverObj.getPlayers(): |
|||
# Players - Fields: 0 = UserID, 6 = ChannelID |
|||
self.players[ thePlayer[0] ] = mmPlayer( thePlayer, self.channels[ thePlayer[6] ] ); |
|||
|
|||
|
|||
playerCount = property( |
|||
lambda self: len( self.players ), |
|||
None |
|||
); |
|||
|
|||
def __str__( self ): |
|||
return '<Server "%s" (%d)>' % ( self.rootName, self.id ); |
|||
|
|||
def visit( self, callback, lvl = 0 ): |
|||
if not callable( callback ): |
|||
raise Exception, "a callback should be callable..."; |
|||
|
|||
# call callback first on myself, then visit my root chan |
|||
callback( self, lvl ); |
|||
self.channels[0].visit( callback, lvl + 1 ); |
|||
|
|||
|
|||
class mmChannel( object ): |
|||
# channels = list(); |
|||
# subchans = list(); |
|||
# id = int(); |
|||
# name = str(); |
|||
# parent = mmChannel(); |
|||
# linked = list(); |
|||
# linkedIDs = list(); |
|||
|
|||
def __init__( self, channelObj, parentChan = None ): |
|||
self.players = list(); |
|||
self.subchans = list(); |
|||
self.linked = list(); |
|||
|
|||
(self.id, self.name, parent, self.linkedIDs ) = channelObj; |
|||
|
|||
self.parent = parentChan; |
|||
if self.parent is not None: |
|||
self.parent.subchans.append( self ); |
|||
|
|||
def parentChannels( self ): |
|||
if self.parent is None or isinstance( self.parent, mmServer ): |
|||
return []; |
|||
return self.parent.parentChannels() + [self.parent.name]; |
|||
|
|||
playerCount = property( |
|||
lambda self: len( self.players ) + sum( [ chan.playerCount for chan in self.subchans ] ), |
|||
None |
|||
); |
|||
|
|||
def __str__( self ): |
|||
return '<Channel "%s" (%d)>' % ( self.name, self.id ); |
|||
|
|||
def visit( self, callback, lvl = 0 ): |
|||
# call callback on myself, then visit my subchans, then my players |
|||
callback( self, lvl ); |
|||
for sc in self.subchans: |
|||
sc.visit( callback, lvl + 1 ); |
|||
for pl in self.players: |
|||
pl.visit( callback, lvl + 1 ); |
|||
|
|||
|
|||
|
|||
class mmPlayer( object ): |
|||
# muted = bool; |
|||
# deafened = bool; |
|||
# suppressed = bool; |
|||
# selfmuted = bool; |
|||
# selfdeafened = bool; |
|||
|
|||
# channel = mmChannel(); |
|||
# dbaseid = int(); |
|||
# userid = int(); |
|||
# name = str(); |
|||
# onlinesince = time(); |
|||
# bytesPerSec = int(); |
|||
|
|||
def __init__( self, playerObj, playerChan ): |
|||
( self.userid, self.muted, self.deafened, self.suppressed, self.selfmuted, self.selfdeafened, chanID, self.dbaseid, self.name, onlinetime, self.bytesPerSec ) = playerObj; |
|||
self.onlinesince = datetime.datetime.fromtimestamp( float( time() - onlinetime ) ); |
|||
self.channel = playerChan; |
|||
self.channel.players.append( self ); |
|||
|
|||
def __str__( self ): |
|||
return '<Player "%s" (%d, %d)>' % ( self.name, self.userid, self.dbaseid ); |
|||
|
|||
def isAuthed( self ): |
|||
return self.dbaseid != -1; |
|||
|
|||
# kept for compatibility to mmChannel (useful for traversal funcs) |
|||
playerCount = property( |
|||
lambda self: -1, |
|||
None |
|||
); |
|||
|
|||
def visit( self, callback, lvl = 0 ): |
|||
callback( self, lvl ); |
|||
|
|||
|
|||
if __name__ == '__main__': |
|||
# connect to dbus |
|||
bus = dbus.SystemBus(); |
|||
|
|||
# get our murmur servers |
|||
dbus_base = 'net.sourceforge.mumble.murmur'; |
|||
murmur = bus.get_object( dbus_base, '/' ); |
|||
|
|||
# example callback |
|||
def travrz( obj, lvl ): |
|||
print lvl*'-', str(obj); |
|||
|
|||
# show each server |
|||
for srv in murmur.getBootedServers(): |
|||
theSrv = bus.get_object( dbus_base, '/%d' % srv ); |
|||
|
|||
srvobj = mmServer( srv, theSrv, 'teh %d srvz root' % srv ); |
|||
srvobj.visit( travrz ); |
|||
|
@ -0,0 +1,157 @@ |
|||
from django.contrib.auth.models import User |
|||
from django.db import models |
|||
|
|||
from mmobjects import mmServer |
|||
|
|||
import dbus |
|||
import socket |
|||
|
|||
class Mumble( models.Model ): |
|||
name = models.CharField( 'Server Name', max_length = 200 ); |
|||
dbus = models.CharField( 'DBus base', max_length = 200, default = 'net.sourceforge.mumble.murmur' ); |
|||
srvid = models.IntegerField( 'Server ID', editable = False ); |
|||
addr = models.CharField( 'Server Address', max_length = 200 ); |
|||
port = models.IntegerField( 'Server Port', blank = True, null = True ); |
|||
url = models.CharField( 'Website URL', max_length = 200, blank = True ); |
|||
motd = models.TextField( 'Welcome Message', blank = True ); |
|||
passwd = models.CharField( 'Server Password', max_length = 200, blank = True ); |
|||
users = models.IntegerField( 'Max. Users', blank = True, null = True ); |
|||
bwidth = models.IntegerField( 'Bandwidth [Bps]', blank = True, null = True ); |
|||
sslcrt = models.CharField( 'SSL Certificate', max_length = 200, blank = True ); |
|||
sslkey = models.CharField( 'SSL Key', max_length = 200, blank = True ); |
|||
booted = models.BooleanField( 'Boot Server', default = True ); |
|||
|
|||
def getDbusMeta( self ): |
|||
return dbus.SystemBus().get_object( self.dbus, '/' ); |
|||
|
|||
def getDbusObject( self ): |
|||
"Connects to DBus and returns an mmServer object representing this Murmur instance." |
|||
bus = dbus.SystemBus(); |
|||
murmur = bus.get_object( self.dbus, '/' ); |
|||
|
|||
if self.srvid not in murmur.getBootedServers(): |
|||
raise Exception, 'No murmur process with the given server ID (%d) is running and attached to system dbus under %s.' % ( self.srvid, self.dbus ); |
|||
|
|||
return bus.get_object( self.dbus, '/%d' % self.srvid ); |
|||
|
|||
def getServerObject( self ): |
|||
return mmServer( self.srvid, self.getDbusObject(), self.name ); |
|||
|
|||
def __unicode__( self ): |
|||
return u'Murmur "%s" (%d)' % ( self.name, self.srvid ); |
|||
|
|||
def save( self ): |
|||
# Prior to saving the model, connect to murmur via dbus and update its settings. |
|||
murmur = self.getDbusMeta(); |
|||
|
|||
# check if this server already exists, if not call newServer and set my srvid first |
|||
if self.id is None: |
|||
self.srvid = murmur.newServer(); |
|||
|
|||
srvid = dbus.Int32( self.srvid ); |
|||
|
|||
murmur.setConf( srvid, 'host', socket.gethostbyname( self.addr ) ); |
|||
murmur.setConf( srvid, 'registerName', self.name ); |
|||
murmur.setConf( srvid, 'registerUrl', self.url ); |
|||
murmur.setConf( srvid, 'welcometext', self.motd ); |
|||
murmur.setConf( srvid, 'serverpassword', self.passwd ); |
|||
murmur.setConf( srvid, 'sslCert', self.sslcrt ); |
|||
murmur.setConf( srvid, 'sslKey', self.sslkey ); |
|||
|
|||
if self.port is not None: |
|||
murmur.setConf( srvid, 'port', str(self.port) ); |
|||
else: |
|||
murmur.setConf( srvid, 'port', '' ); |
|||
|
|||
if self.users is not None: |
|||
murmur.setConf( srvid, 'users', str(self.users) ); |
|||
else: |
|||
murmur.setConf( srvid, 'users', '' ); |
|||
|
|||
if self.bwidth is not None: |
|||
murmur.setConf( srvid, 'bandwidth', str(self.port) ); |
|||
else: |
|||
murmur.setConf( srvid, 'bandwidth', '' ); |
|||
|
|||
# registerHostname needs to take the port no into account |
|||
if self.port and self.port != 64738: |
|||
murmur.setConf( srvid, 'registerHostname', "%s:%d" % ( self.addr, self.port ) ); |
|||
else: |
|||
murmur.setConf( srvid, 'registerHostname', self.addr ); |
|||
|
|||
if self.booted != murmur.isBooted( dbus.Int32(self.srvid) ): |
|||
if self.booted: |
|||
murmur.start( srvid ); |
|||
else: |
|||
murmur.stop( srvid ); |
|||
|
|||
# Now allow django to save the record set |
|||
return models.Model.save( self ); |
|||
|
|||
def deleteServer( self ): |
|||
srvid = dbus.Int32( self.srvid ); |
|||
murmur = self.getDbusMeta(); |
|||
if murmur.isBooted( srvid ): |
|||
murmur.stop( srvid ); |
|||
murmur.deleteServer( srvid ); |
|||
|
|||
@staticmethod |
|||
def pre_delete_listener( **kwargs ): |
|||
kwargs['instance'].deleteServer(); |
|||
|
|||
|
|||
|
|||
|
|||
|
|||
class MumbleUser( models.Model ): |
|||
mumbleid = models.IntegerField( 'Mumble player_id', editable = False, default = -1 ); |
|||
name = models.CharField( 'User name and Login', max_length = 200 ); |
|||
password = models.CharField( 'Login password', max_length = 200 ); |
|||
server = models.ForeignKey( Mumble ); |
|||
owner = models.ForeignKey( User ); |
|||
|
|||
def __unicode__( self ): |
|||
return u"Mumble user %s on %s owned by Django user %s" % ( self.name, self.server, self.owner ); |
|||
|
|||
def save( self ): |
|||
# Before the record set is saved, update Murmur via dbus. |
|||
murmur = self.server.getDbusObject(); |
|||
|
|||
if self.id is None: |
|||
# This is a new user record, so Murmur doesn't know about it yet |
|||
self.mumbleid = murmur.registerPlayer( dbus.String( self.name ) ); |
|||
|
|||
# Update user's registration |
|||
murmur.setRegistration( |
|||
dbus.Int32( self.mumbleid ), |
|||
dbus.String( self.name ), |
|||
dbus.String( self.owner.email ), |
|||
dbus.String( self.password ) |
|||
); |
|||
|
|||
# Don't save the users' passwords, we don't need them anyway |
|||
self.password = ''; |
|||
|
|||
# Now allow django to save the record set |
|||
return models.Model.save( self ); |
|||
|
|||
@staticmethod |
|||
def pre_delete_listener( **kwargs ): |
|||
kwargs['instance'].unregister(); |
|||
|
|||
def unregister( self ): |
|||
# Unregister this player in Murmur via dbus. |
|||
murmur = self.server.getDbusObject(); |
|||
murmur.unregisterPlayer( dbus.Int32( self.mumbleid ) ); |
|||
|
|||
|
|||
|
|||
|
|||
from django.db.models import signals |
|||
|
|||
signals.pre_delete.connect( Mumble.pre_delete_listener, sender=Mumble ); |
|||
signals.pre_delete.connect( MumbleUser.pre_delete_listener, sender=MumbleUser ); |
|||
|
|||
|
|||
|
|||
|
@ -0,0 +1,16 @@ |
|||
from django import template |
|||
|
|||
register = template.Library(); |
|||
|
|||
### FILTER: mrange -- used to render the ||| lines in the channel tree |
|||
|
|||
def mrange( value ): |
|||
"If value > 1, returns range( value - 1 ), else returns an empty list." |
|||
val = int( value ); |
|||
if( val > 1 ): |
|||
return range( val - 1 ); |
|||
return list(); |
|||
|
|||
register.filter( 'mrange', mrange ); |
|||
|
|||
|
@ -0,0 +1,8 @@ |
|||
from django.conf.urls.defaults import * |
|||
|
|||
urlpatterns = patterns( |
|||
'', |
|||
( r'savereg', 'mumble.views.savereg' ), |
|||
( r'reg/(?P<server>\d+)', 'mumble.views.register' ), |
|||
( r'(?P<server>\d+)', 'mumble.views.show' ), |
|||
) |
@ -0,0 +1,115 @@ |
|||
from django.shortcuts import render_to_response, get_object_or_404, get_list_or_404 |
|||
from django.template import RequestContext |
|||
from django.http import HttpResponseRedirect |
|||
from django.core.urlresolvers import reverse |
|||
from django.contrib.auth.decorators import login_required |
|||
|
|||
from models import Mumble, MumbleUser |
|||
from mmobjects import mmServer, mmChannel |
|||
|
|||
import dingenskirchen; |
|||
|
|||
class Storage( object ): |
|||
s = list(); |
|||
r = None; |
|||
|
|||
|
|||
def show( request, server ): |
|||
"Displays the channel list for the given Server ID." |
|||
srv, o = createChannelList( server ); |
|||
|
|||
return render_to_response( |
|||
'mumble/mumble.htm', |
|||
{ 'DBaseObject': srv, 'ServerObject': o, 'ChannelTable': Storage.s }, |
|||
context_instance = RequestContext(request) |
|||
); |
|||
|
|||
|
|||
def showContent( server, user = None ): |
|||
"Renders and returns the channel list for the given Server ID." |
|||
from django.template import Context, loader |
|||
|
|||
srv, o = createChannelList( server ); |
|||
|
|||
mumbleAcc = None; |
|||
if user is not None: |
|||
mmUsers = MumbleUser.objects.filter( owner = user ); |
|||
if mmUsers: |
|||
mumbleAcc = mmUsers[0]; |
|||
|
|||
t_content = loader.get_template( 'mumble/content.htm' ); |
|||
c_content = Context( { 'DBaseObject': srv, 'ServerObject': o, 'ChannelTable': Storage.s, 'user': user, 'mumbleAccount': mumbleAcc } ); |
|||
r_content = t_content.render( c_content ); |
|||
|
|||
return r_content; |
|||
|
|||
|
|||
def createChannelList( server ): |
|||
"Renders the channel list." |
|||
srv = get_object_or_404( Mumble, id=server ); |
|||
|
|||
o = srv.getServerObject(); |
|||
|
|||
Storage.s = list(); |
|||
Storage.r = o.channels[0]; |
|||
o.channels[0].visit( renderListItem, 0 ); |
|||
|
|||
return srv, o; |
|||
|
|||
|
|||
def renderListItem( item, level ): |
|||
"Stores a line in the channel list." |
|||
if item == Storage.r: |
|||
return; |
|||
|
|||
# Filter channels that don't have players in them and are not a subchannel of root |
|||
if level > 1 and item.playerCount == 0: |
|||
# I used to test if item is an instance of mmChannel here. For some reason, that doesn't work. Dunno why. |
|||
return; |
|||
|
|||
if isinstance( item, mmChannel ): |
|||
Storage.s.append( ( level, item, item.parentChannels() ) ); |
|||
else: |
|||
Storage.s.append( ( level, item ) ); |
|||
|
|||
|
|||
|
|||
@login_required |
|||
def register( request, server ): |
|||
# Register the current user with this mumble server, or give them a form to change their registration data. |
|||
srv = Mumble.objects.get( id=server ); |
|||
|
|||
if request.user.is_authenticated(): |
|||
reg = MumbleUser.objects.get( server=srv, owner=request.user ); |
|||
else: |
|||
reg = None; |
|||
|
|||
return render_to_response( |
|||
'mumble/reg.htm', |
|||
{ 'Mumble': srv, 'Reg': reg }, |
|||
context_instance = RequestContext(request) |
|||
); |
|||
|
|||
@login_required |
|||
def savereg( request ): |
|||
#if not request.user.is_authenticated(): |
|||
# raise Exception, "You need to be logged in to register yourself with Mumble."; |
|||
|
|||
srv = Mumble.objects.get( id=request.POST['id'] ); |
|||
reg = MumbleUser.objects.get( server=srv, owner=request.user ); |
|||
|
|||
if reg is None: |
|||
reg = MumbleUser( name=request.POST['username'], password=request.POST['password'], server=srv, owner=request.user ); |
|||
else: |
|||
reg.name = request.POST['username']; |
|||
reg.password = request.POST['password']; |
|||
|
|||
reg.save(); |
|||
return HttpResponseRedirect( "/mumble/%d" % srv.id ); |
|||
|
|||
|
|||
|
|||
|
|||
|
|||
|
|||
|
@ -0,0 +1,54 @@ |
|||
{% load mumble_extras %} |
|||
<div class="rahmen"> |
|||
<table cellspacing="0" cellpadding="0"> |
|||
<tr> |
|||
<td class="mumble"> |
|||
<img src="/static/mumble/mumble.16x16.png" alt="mumble" /> |
|||
{{ ServerObject.rootName }} |
|||
</td> |
|||
</tr> |
|||
{% for item in ChannelTable %} |
|||
<tr> |
|||
<td class="mumble mm-left"> |
|||
{% spaceless %} |
|||
{% for num in item.0|mrange %} |
|||
<img src="/static/mumble/linie_v_trans.png" alt="|" /> |
|||
{% endfor %} |
|||
<img src="/static/mumble/knoten_v_trans.png" alt="+-" /> |
|||
{% endspaceless %} |
|||
{% if item.1.userid %} |
|||
<img src="/static/mumble/talking_off.png" alt="player" title="Player" /> |
|||
<span title="Online since {{item.1.onlinesince|time:"H:i"}}">{{ item.1.name }}</span> |
|||
{% else %} |
|||
{% if item.1.linked %} |
|||
<img src="/static/mumble/channel_linked.png" alt="linked channel" title="Channel with links" /> |
|||
{% else %} |
|||
<img src="/static/mumble/channel.png" alt="channel" title="Channel" /> |
|||
{% endif %} |
|||
<a href="mumble://{% if mumbleAccount %}{{ mumbleAccount.name }}@{% endif %}{{ DBaseObject.addr }}/{% for chan in item.2 %}{{ chan|urlencode }}/{% endfor %}{{ item.1.name|urlencode }}" class="dingen">{{ item.1.name }}</a> |
|||
{% endif %} |
|||
</td> |
|||
<td class="mumble"> |
|||
{% if item.1.userid %} |
|||
{% if item.1.isAuthed %} |
|||
<img src="/static/mumble/authenticated.png" alt="authed" title="Authenticated" /> |
|||
{% endif %} |
|||
{% if item.1.muted %} |
|||
<img src="/static/mumble/muted_server.png" alt="muted" title="Muted by server" /> |
|||
{% endif %} |
|||
{% if item.1.deafened %} |
|||
<img src="/static/mumble/deafened_server.png" alt="deafened" title="Deafened by server" /> |
|||
{% endif %} |
|||
{% if item.1.selfmuted %} |
|||
<img src="/static/mumble/muted_self.png" alt="self-muted" title="Muted by themselves" /> |
|||
{% endif %} |
|||
{% if item.1.selfdeafened %} |
|||
<img src="/static/mumble/deafened_self.png" alt="self-deafened" title="Deafened by themselves" /> |
|||
{% endif %} |
|||
{% endif %} |
|||
</td> |
|||
</tr> |
|||
{% endfor %} |
|||
</table> |
|||
<p><a href="/mumble/reg/{{DBaseObject.id}}" class="dingen">Mumble-Account verwalten</a></p> |
|||
</div> |
@ -0,0 +1,47 @@ |
|||
{% load mumble_extras %} |
|||
<div class="rahmen"> |
|||
<div class="mumble"> |
|||
<img src="/static/mumble/mumble.16x16.png" alt="mumble" /> |
|||
{{ ServerObject.rootName }} |
|||
</div> |
|||
{% for item in ChannelTable %} |
|||
<div class="mumble"> |
|||
{% spaceless %} |
|||
{% for num in item.0|mrange %} |
|||
<img src="/static/mumble/linie_v_trans.png" alt="|" /> |
|||
{% endfor %} |
|||
<img src="/static/mumble/knoten_v_trans.png" alt="+-" /> |
|||
{% endspaceless %} |
|||
{% if item.1.userid %} |
|||
<img src="/static/mumble/talking_off.png" alt="player" title="Player" /> |
|||
<span title="Online since {{item.1.onlinesince|time:"H:i"}}">{{ item.1.name }}</span> |
|||
{% else %} |
|||
{% if item.1.linked %} |
|||
<img src="/static/mumble/channel_linked.png" alt="linked channel" title="Channel with links" /> |
|||
{% else %} |
|||
<img src="/static/mumble/channel.png" alt="channel" title="Channel" /> |
|||
{% endif %} |
|||
<a href="mumble://{{ DBaseObject.addr }}" class="dingen">{{ item.1.name }}</a> |
|||
{% endif %} |
|||
<span class="dingen"> |
|||
{% if item.1.userid %} |
|||
{% if item.1.isAuthed %} |
|||
<img src="/static/mumble/authenticated.png" alt="authed" title="Authenticated" /> |
|||
{% endif %} |
|||
{% if item.1.muted %} |
|||
<img src="/static/mumble/muted_server.png" alt="muted" title="Muted by server" /> |
|||
{% endif %} |
|||
{% if item.1.deafened %} |
|||
<img src="/static/mumble/deafened_server.png" alt="deafened" title="Deafened by server" /> |
|||
{% endif %} |
|||
{% if item.1.selfmuted %} |
|||
<img src="/static/mumble/muted_self.png" alt="self-muted" title="Muted by themselves" /> |
|||
{% endif %} |
|||
{% if item.1.selfdeafened %} |
|||
<img src="/static/mumble/deafened_self.png" alt="self-deafened" title="Deafened by themselves" /> |
|||
{% endif %} |
|||
{% endif %} |
|||
</span> |
|||
</div> |
|||
{% endfor %} |
|||
</div> |
@ -0,0 +1,10 @@ |
|||
{% extends "base.htm" %} |
|||
{% block modelstyle %} |
|||
{% include "mumble/style.htm" %} |
|||
{% endblock %} |
|||
{% block headtags %} |
|||
<meta http-equiv="refresh" content="30" /> |
|||
{% endblock %} |
|||
{% block content %} |
|||
{% include "mumble/content.htm" %} |
|||
{% endblock %} |
@ -0,0 +1,29 @@ |
|||
{% extends "base.htm" %} |
|||
{% block content %} |
|||
{% if user.is_authenticated %} |
|||
<h2>Mumble-Benutzerdaten festlegen</h2> |
|||
<p>Diese Logindaten musst du angeben, um als authentifizierter Benutzer zu Mumble zu verbinden. Gib hier bitte deinen gewünschten Benutzernamen und dein gewünschtes Passwort an.</p> |
|||
<form action="/mumble/savereg" method="post"> |
|||
<input type="hidden" name="id" value="{{Mumble.id}}" /> |
|||
<table> |
|||
<tr> |
|||
<td>Server</td> |
|||
<td>{{Mumble.name}}</td> |
|||
</tr> |
|||
<tr> |
|||
<td>Benutzername/Login</td> |
|||
<td><input name="username" {% if Reg %}value="{{Reg.name}}"{% endif %} /></td> |
|||
</tr> |
|||
<tr> |
|||
<td>Passwort</td> |
|||
<td><input name="password" type="password" /></td> |
|||
</tr> |
|||
<tr> |
|||
<td colspan="2"><input type="submit" /></td> |
|||
</tr> |
|||
</table> |
|||
</form> |
|||
{% else %} |
|||
<p>Dieses Privileg steht nur den Mitgliedern des Hohen Rates zu.</p> |
|||
{% endif %} |
|||
{% endblock %} |
@ -0,0 +1 @@ |
|||
|
Write
Preview
Loading…
Cancel
Save
Reference in new issue