aa.js

 avatar
unknown
javascript
a year ago
10 kB
6
Indexable
var web;
var joined = false;
let isRecording = false;
let mediaRecorder = null;
let recorder;
var recordinguser;
var client = AgoraRTC.createClient(
{
	mode: "rtc",
	codec: "vp8",
});
var localTracks = {
	videoTrack: null,
	audioTrack: null,
	audioTrack: null,
	audioEffectTrack: null,
};
var localTrackState = {
	videoTrackMuted: false,
	audioTrackMuted: false,
};
let myArray = ["e0b3e357-44c2-4086-b191-434a042c0fa9"];
let audioElement = document.getElementById('audio');
let chunks = [];
let recordButton = document.getElementById('record-button');
let stopButton = document.getElementById('stop-button');
var remoteUsers = {};
var audioMixing = {
	state: "IDLE",
	duration: 0,
};

function getRandomImage()
{
	const randomIndex = Math.floor(Math.random() * 15) + 1;
	return `/image/${randomIndex}.png`
}

function toggleMute(userIcon, uid)
{
	const muteIcon = userIcon.querySelector(".mute-icon");
	if (dict.hasOwnProperty(uid))
	{
		user = dict[uid].userId;
		if (!muteIcon)
		{
			const img = document.createElement("img");
			img.src = "image/mute.png";
			img.classList.add("mute-icon");
			if (!myArray.includes(user))
			{
				unsubscribe(uid);
				userIcon.appendChild(img)
			}
		}
		else
		{
			if (!myArray.includes(user))
			{
				subscribe(uid);
				userIcon.removeChild(muteIcon)
			}
			else
			{
				alert("owner hoon lawde")
			}
		}
	}
	else
	{
		if (!muteIcon)
		{
			const img = document.createElement("img");
			img.src = "image/mute.png";
			img.classList.add("mute-icon");
			unsubscribe(uid);
			userIcon.appendChild(img)
		}
		else
		{
			subscribe(uid);
			userIcon.removeChild(muteIcon)
		}
	}
}
let initVolumeIndicator = async() =>
{
	AgoraRTC.setParameter("AUDIO_VOLUME_INDICATION_INTERVAL", 200);
	client.enableAudioVolumeIndicator();
	client.on("volume-indicator", (volumes) =>
	{
		volumes.forEach((volume) =>
		{
			try
			{
				let item = document.getElementsByClassName(`avatar-${volume.uid}`)[0];
				if (volume.level >= 20)
				{
					item.style.borderColor = "#00ff00"
				}
				else
				{
					item.style.borderColor = "#fff"
				}
			}
			catch (error)
			{
				console.error(error)
			}
		})
	})
};
const playButton = $(".play");
let audioMixingProgressAnimation;

function joinChannel(uid)
{
	const userIcon = document.createElement("div");
	userIcon.classList.add("user-icon");
	userIcon.setAttribute("data-uid", uid);
	const img = document.createElement("img");
	const imageUrl = getRandomImage();
	img.src = imageUrl;
	const userName = document.createElement("div");
	userName.classList.add("user-name");
	var uss = dict[uid];
	userName.innerText = uss;
	userIcon.appendChild(img);
	userIcon.appendChild(userName);
	document.getElementById("user-container").appendChild(userIcon);
	const muteIcon = document.createElement("img");
	muteIcon.src = "image/mute.png";
	muteIcon.classList.add("mute-icon");
	userIcon.appendChild(muteIcon);
	userIcon.addEventListener("click", () =>
	{
		console.log(`User ${uid}clicked`);
		toggleMute(userIcon, uid)
	})
}
var volume = 50;

function decreaseVolume()
{
	if (volume > 0)
	{
		if (volume <= 10)
		{
			volume -= 1;
			volumeLevel.textContent = volume;
			setVolume(volume)
		}
		else
		{
			volume -= 10;
			volumeLevel.textContent = volume;
			setVolume(volume)
		}
	}
}
var volumeLevel = document.getElementById("volumeLevel");

function increaseVolume()
{
	if (volume < 100)
	{
		if (volume < 10)
		{
			volume += 1;
			volumeLevel.textContent = volume;
			setVolume(volume)
		}
		else
		{
			volume += 10;
			volumeLevel.textContent = volume;
			setVolume(volume)
		}
	}
}
$("#mute-audio").click(async function(e)
{
	await muteAudio()
});
$("#unmute-audio").click(async function(e)
{
	await unmuteAudio()
});
$("#resume").click(async function(e)
{
	await stream()
});
$("#pause").click(function(e)
{
	pause()
});
$("#join-form").submit(async function(e)
{
	e.preventDefault();
	$("#join").attr("disabled", true);
	try
	{
		await join();
		if (options.token)
		{
			$("#success-alert-with-token").css("display", "block")
		}
		else
		{
			$("#success-alert").css("display", "block")
		}
	}
	catch (error)
	{
		console.error(error)
	}
	finally
	{
		$("#leave").attr("disabled", false);
		$("#audio-mixing").attr("disabled", false);
		$("#audio-effect").attr("disabled", false);
		$("#stop-audio-mixing").attr("disabled", false);
		$("#local-audio-mixing").attr("disabled", false)
	}
});

function removeAllUsers()
{
	const userIcons = document.getElementsByClassName("user-icon");
	console.log(userIcons);
	while (userIcons.length > 0)
	{
		userIcons[0].remove()
	}
}
$("#leave").click(async function(e)
{
	const membersDiv = document.getElementById("members");
	membersDiv.innerHTML = "";
	leave()
});
async function join()
{
	client.on("user-joined", handleUserJoined);
	client.on("user-left", handleUserLeft);
	client.on("user-published", userpublished);
	client.on("user-unpublished", userunpublished);
	[options.uid] = await Promise.all([client.join(options.appid, options.channel, options.token || null, options.uid || null), ]);
	joined = true;
	initVolumeIndicator();
	console.log("publish success")
}
async function leave()
{
	for (trackName in localTracks)
	{
		var track = localTracks[trackName];
		if (track)
		{
			track.stop();
			track.close();
			localTracks[trackName] = null
		}
	}
	remoteUsers = {};
	$("#remote-playerlist").html("");
	await client.leave();
	$("#local-player-name").text("");
	$("#join").attr("disabled", false);
	$("#leave").attr("disabled", true);
	$("#audio-mixing").attr("disabled", true);
	$("#audio-effect").attr("disabled", true);
	$("#stop-audio-mixing").attr("disabled", true);
	$("#local-audio-mixing").attr("disabled", true);
	console.log("client leaves channel success")
}
async function subscribe(uid2)
{
	var userList = client.remoteUsers;
	for (const user of userList)
	{
		if (user.uid === uid2)
		{
			await client.subscribe(user, "audio");
			let stream = new MediaStream();
			stream.addTrack(user.audioTrack.getMediaStreamTrack());
			audioElement.srcObject = stream;
			recordinguser = uid2;
			user.audioTrack.play();
			user.audioTrack.setVolume(100);
			console.log("audio enabled for " + user.uid)
		}
	}
}

function handleUserJoined(user)
{
	if (dict.hasOwnProperty(user.uid))
	{
		var name = dict[user.uid].nickname;
		var imageUrl = dict[user.uid].icon
	}
	else
	{
		var name = user.uid;
		var imageUrl = getRandomImage()
	}
	let newMember = `<div class="speaker user-rtc-${user.uid}"id="${user.uid}"><img class="user-avatar avatar-${user.uid}"src="${imageUrl}"/><p>${name}</p><div class="dot-red"></div></div>`;
	document.getElementById("members").insertAdjacentHTML("beforeend", newMember);
	var userIcon = document.getElementById(user.uid);
	const muteIcon = document.createElement("img");
	muteIcon.src = "image/mute.png";
	muteIcon.classList.add("mute-icon");
	userIcon.appendChild(muteIcon);
	userIcon.addEventListener("click", () =>
	{
		console.log(`User ${user.uid}clicked`);
		toggleMute(userIcon, user.uid)
	});
	var userIcons = document.querySelectorAll(".speaker");
	for (var i = 0; i < userIcons.length; i++)
	{
		var icon = userIcons[i];
		var iconUid = icon.getAttribute("id");
		if (iconUid !== user.uid)
		{
			var iconNickname = dict[iconUid] ? dict[iconUid].nickname : iconUid;
			var iconImageUrl = dict[iconUid] ? dict[iconUid].icon : getRandomImage();
			icon.querySelector("p").textContent = iconNickname;
			icon.querySelector(".user-avatar").setAttribute("src", iconImageUrl)
		}
	}
}

function handleUserLeft(user)
{
	console.log("userleft" + user.uid);
	document.getElementById(user.uid).remove();
	delete dict[user.uid]
}

function userpublished(user)
{
	console.log("user published " + user.uid);
	const userIcon = document.getElementById(user.uid);
	const greenDot = document.createElement("div");
	greenDot.classList.add("dot-green");
	userIcon.appendChild(greenDot);
	const redDot = userIcon.querySelector(".dot-red");
	const muteIcon = userIcon.querySelector(".mute-icon");
	if (!muteIcon)
	{
		client.subscribe(user, "audio");
		user.audioTrack.play()
	}
	if (redDot)
	{
		userIcon.removeChild(redDot)
	}
}

function userunpublished(user)
{
	console.log("user unpublished " + user.uid);
	const userIcon = document.getElementById(user.uid);
	const redDot = document.createElement("div");
	redDot.classList.add("dot-red");
	userIcon.appendChild(redDot);
	const greenDot = userIcon.querySelector(".dot-green");
	if (greenDot)
	{
		userIcon.removeChild(greenDot)
	}
}
async function unsubscribe(uid2)
{
	var userList = client.remoteUsers;
	for (const user of userList)
	{
		if (user.uid === uid2)
		{
			await client.unsubscribe(user, "audio");
			console.log("audio didbled for " + user.uid)
		}
	}
}
async function muteAudio()
{
	localTracks.audioTrack.setMuted(true)
}
async function unmuteAudio()
{
	localTracks.audioTrack.setMuted(false)
}

function handlevolumeindicator(result)
{
	console.log(result)
}

function toMMSS(second)
{
	let MM = parseInt(second / 60);
	let SS = parseInt(second % 60);
	MM = MM < 10 ? "0" + MM : MM;
	SS = SS < 10 ? "0" + SS : SS;
	return `${MM}:${SS}`
}

function download(chunks)
{
	let blob = new Blob(chunks,
	{
		'type': 'audio/mp3; codecs=opus'
	});
	let url = URL.createObjectURL(blob);
	let link = document.createElement('a');
	link.href = url;
	var name = dict[recordinguser].nickname;
	link.download = name + '.mp3';
	link.click();
	URL.revokeObjectURL(url)
}

function startRecording()
{
	if (!isRecording)
	{
		let stream = audioElement.srcObject;
		recorder = new MediaRecorder(stream);
		let chunks = [];
		recorder.ondataavailable = function(event)
		{
			chunks.push(event.data)
		};
		recorder.onstop = function()
		{
			download(chunks)
		};
		recorder.start();
		isRecording = true
	}
}

function stopRecording()
{
	if (isRecording)
	{
		recorder.stop();
		isRecording = false
	}
}
recordButton.onclick = function()
{
	startRecording()
};
stopButton.onclick = function()
{
	stopRecording()
};
Editor is loading...