#!/usr/bin/env python # -*- coding: utf-8 -*- # # Copyright 2010 Maurizio Porrato # See LICENSE.txt for copyright info from __future__ import with_statement from zope.interface import implements from twisted.plugin import IPlugin from twisted.application.service import IServiceMaker from frn.protocol.client import FRNClient, FRNClientFactory from frn.user import FRNUser from twisted.application import internet from twisted.internet import reactor, task from twisted.internet.defer import DeferredList from twisted.python import log, usage import os, string, time, struct from os.path import curdir, join as pjoin from ConfigParser import ConfigParser safe_chars = string.ascii_letters+string.digits+' :;.,+-=$@' WAV_HEADER = "524946460c06000057415645666d74201400000031000100401f00005906000041000000020040016661637404000000000000006461746100000000".decode('hex') AUDIO_TIMEOUT = 5.0 def sanitizeFilename(name): r = '' for c in name: if c in safe_chars: r += c return r class FRNRecorder(FRNClient): def getClientName(self, client_id): if self.clientsById.has_key(client_id): return self.clientsById[client_id]['ON'] else: return client_id def buildRecordingName(self, client_id): ts = time.localtime() opname = sanitizeFilename(self.clients[client_id-1]['ON']) dirname = self.factory.recdir+"/"+time.strftime("%Y%m/%d/%H", ts) filename = time.strftime("%Y%m%d-%H%M%S-", ts) + opname + '.wav' try: os.makedirs(dirname) except OSError: pass return dirname+'/'+filename def buildMessageLogName(self): ts = time.localtime() dirname = self.factory.recdir+"/"+time.strftime("%Y%m/%d/%H", ts) filename = time.strftime("%Y%m%d-%H-", ts) + 'messages.txt' try: os.makedirs(dirname) except OSError: pass return dirname+'/'+filename def textMessageReceived(self, client, message, target): if target == 'A': f = open(self.buildMessageLogName(), 'a') ts = time.strftime("%Y-%m-%d %H:%M:%S") f.write("[%s] [%s] %s\r\n" % (ts, self.getClientName(client), message)) f.close() def closeFile(self): size = self.recordingFile.tell()-len(WAV_HEADER) time = size / 1625.0 if time > self.factory.mintime: self.recordingFile.seek(0x30) # fact chunk value self.recordingFile.write(struct.pack("