DappMeetingV3 / listenSM.html
Luisnguyen1
no final
fb2d702
<!DOCTYPE html>
<html lang="vi">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Listen to Smart Contract Events</title>
<script src="https://cdnjs.cloudflare.com/ajax/libs/web3/4.0.2/web3.min.js"></script>
</head>
<body>
<h2>Smart Contract Event Listener</h2>
<button onclick="connectWallet()">Kết nối Metamask</button>
<div id="events"></div>
<script>
const contractAddress = "0xc8d9f01b9d1552D276a589db920620F328B7208E";
const contractABI = [
{
"inputs": [],
"stateMutability": "nonpayable",
"type": "constructor"
},
{
"anonymous": false,
"inputs": [
{
"indexed": false,
"internalType": "string",
"name": "roomId",
"type": "string"
},
{
"indexed": false,
"internalType": "address",
"name": "sessionId",
"type": "address"
},
{
"indexed": false,
"internalType": "string[]",
"name": "dataChannels",
"type": "string[]"
}
],
"name": "DataChannelsUpdated",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{
"indexed": false,
"internalType": "string",
"name": "roomId",
"type": "string"
},
{
"indexed": false,
"internalType": "address",
"name": "user",
"type": "address"
}
],
"name": "JoinedRoom",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{
"indexed": false,
"internalType": "string",
"name": "roomId",
"type": "string"
},
{
"indexed": false,
"internalType": "address",
"name": "user",
"type": "address"
}
],
"name": "LeftRoom",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{
"indexed": false,
"internalType": "string",
"name": "roomId",
"type": "string"
},
{
"indexed": false,
"internalType": "string",
"name": "key",
"type": "string"
},
{
"indexed": false,
"internalType": "string",
"name": "value",
"type": "string"
}
],
"name": "MetadataUpdated",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{
"indexed": false,
"internalType": "string",
"name": "roomId",
"type": "string"
},
{
"indexed": false,
"internalType": "string",
"name": "name",
"type": "string"
},
{
"indexed": false,
"internalType": "address",
"name": "owner",
"type": "address"
}
],
"name": "RoomCreated",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{
"indexed": false,
"internalType": "string",
"name": "roomId",
"type": "string"
},
{
"indexed": false,
"internalType": "bool",
"name": "isActive",
"type": "bool"
}
],
"name": "RoomStatusChanged",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{
"indexed": false,
"internalType": "string",
"name": "roomId",
"type": "string"
},
{
"indexed": true,
"internalType": "address",
"name": "user",
"type": "address"
},
{
"indexed": false,
"internalType": "string",
"name": "sessionID",
"type": "string"
}
],
"name": "SessionIDUpdated",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{
"indexed": false,
"internalType": "string",
"name": "roomId",
"type": "string"
},
{
"indexed": false,
"internalType": "address",
"name": "sessionId",
"type": "address"
},
{
"indexed": false,
"internalType": "string",
"name": "sdp",
"type": "string"
},
{
"indexed": false,
"internalType": "string",
"name": "sdpType",
"type": "string"
}
],
"name": "SessionRenegotiated",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{
"indexed": false,
"internalType": "string",
"name": "roomId",
"type": "string"
},
{
"indexed": false,
"internalType": "address",
"name": "participant",
"type": "address"
},
{
"indexed": false,
"internalType": "string",
"name": "trackName",
"type": "string"
}
],
"name": "TrackPublished",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{
"indexed": false,
"internalType": "string",
"name": "roomId",
"type": "string"
},
{
"indexed": false,
"internalType": "address",
"name": "sessionId",
"type": "address"
},
{
"indexed": false,
"internalType": "address",
"name": "remoteSession",
"type": "address"
},
{
"indexed": false,
"internalType": "string",
"name": "trackName",
"type": "string"
}
],
"name": "TrackPulled",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{
"indexed": false,
"internalType": "string",
"name": "roomId",
"type": "string"
},
{
"indexed": false,
"internalType": "address",
"name": "participant",
"type": "address"
},
{
"indexed": false,
"internalType": "string",
"name": "trackName",
"type": "string"
}
],
"name": "TrackUnpublished",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{
"indexed": true,
"internalType": "address",
"name": "userAddress",
"type": "address"
},
{
"indexed": false,
"internalType": "bool",
"name": "isModerator",
"type": "bool"
},
{
"indexed": false,
"internalType": "string",
"name": "role",
"type": "string"
}
],
"name": "UserUpdated",
"type": "event"
},
{
"inputs": [
{
"internalType": "string",
"name": "urls",
"type": "string"
},
{
"internalType": "string",
"name": "username",
"type": "string"
},
{
"internalType": "string",
"name": "credential",
"type": "string"
}
],
"name": "addIceServer",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "string",
"name": "roomId",
"type": "string"
},
{
"internalType": "address",
"name": "user",
"type": "address"
}
],
"name": "checkUserInRoom",
"outputs": [
{
"internalType": "bool",
"name": "",
"type": "bool"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "string",
"name": "roomId",
"type": "string"
},
{
"internalType": "string",
"name": "name",
"type": "string"
},
{
"internalType": "string",
"name": "metadata",
"type": "string"
}
],
"name": "createRoom",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [],
"name": "getAllRooms",
"outputs": [
{
"internalType": "string[]",
"name": "",
"type": "string[]"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [],
"name": "getIceServers",
"outputs": [
{
"components": [
{
"internalType": "string",
"name": "urls",
"type": "string"
},
{
"internalType": "string",
"name": "username",
"type": "string"
},
{
"internalType": "string",
"name": "credential",
"type": "string"
}
],
"internalType": "struct Meeting.ICEServer[]",
"name": "",
"type": "tuple[]"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "string",
"name": "roomId",
"type": "string"
}
],
"name": "getRoomDetails",
"outputs": [
{
"internalType": "string",
"name": "id",
"type": "string"
},
{
"internalType": "string",
"name": "name",
"type": "string"
},
{
"internalType": "string",
"name": "metadata",
"type": "string"
},
{
"internalType": "address",
"name": "roomOwner",
"type": "address"
},
{
"internalType": "uint256",
"name": "createdAt",
"type": "uint256"
},
{
"internalType": "bool",
"name": "isActive",
"type": "bool"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "string",
"name": "roomId",
"type": "string"
},
{
"internalType": "string",
"name": "key",
"type": "string"
}
],
"name": "getRoomMetadata",
"outputs": [
{
"internalType": "string",
"name": "",
"type": "string"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "string",
"name": "roomId",
"type": "string"
}
],
"name": "getRoomParticipants",
"outputs": [
{
"internalType": "address[]",
"name": "",
"type": "address[]"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "string",
"name": "roomId",
"type": "string"
},
{
"internalType": "address",
"name": "user",
"type": "address"
}
],
"name": "getSessionID",
"outputs": [
{
"internalType": "string",
"name": "",
"type": "string"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "string",
"name": "roomId",
"type": "string"
},
{
"internalType": "address",
"name": "participantAddr",
"type": "address"
}
],
"name": "getSessionTracks",
"outputs": [
{
"internalType": "string[]",
"name": "",
"type": "string[]"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "userAddress",
"type": "address"
}
],
"name": "getUserInfo",
"outputs": [
{
"internalType": "address",
"name": "userId",
"type": "address"
},
{
"internalType": "bool",
"name": "isModerator",
"type": "bool"
},
{
"internalType": "string",
"name": "role",
"type": "string"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "string",
"name": "roomId",
"type": "string"
}
],
"name": "joinRoom",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "string",
"name": "roomId",
"type": "string"
}
],
"name": "leaveRoom",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "string",
"name": "roomId",
"type": "string"
}
],
"name": "roomExists",
"outputs": [
{
"internalType": "bool",
"name": "",
"type": "bool"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "string",
"name": "roomId",
"type": "string"
},
{
"internalType": "string",
"name": "sessionID",
"type": "string"
}
],
"name": "saveSessionID",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "string",
"name": "roomId",
"type": "string"
},
{
"internalType": "bool",
"name": "isActive",
"type": "bool"
}
],
"name": "setRoomStatus",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "userAddress",
"type": "address"
},
{
"internalType": "bool",
"name": "isModerator",
"type": "bool"
},
{
"internalType": "string",
"name": "role",
"type": "string"
}
],
"name": "setUserInfo",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "string",
"name": "roomId",
"type": "string"
},
{
"internalType": "string",
"name": "key",
"type": "string"
},
{
"internalType": "string",
"name": "value",
"type": "string"
}
],
"name": "updateRoomMetadata",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
}
];
let web3;
let contract;
const wsWeb3 = new Web3(new Web3.providers.WebsocketProvider('wss://bsc-testnet-rpc.publicnode.com'));
const wsContract = new wsWeb3.eth.Contract(contractABI, contractAddress);
async function connectWallet() {
if (window.ethereum) {
web3 = new Web3(window.ethereum);
await window.ethereum.request({ method: "eth_requestAccounts" });
const accounts = await web3.eth.getAccounts();
console.log("Connected account:", accounts[0]);
listenToEvents();
} else {
alert("Vui lòng cài đặt MetaMask!");
}
}
function listenToEvents() {
wsContract.events.RoomCreated()
.on("data", event => {
console.log("📥 Room created:", event.returnValues);
const eventData = `
<p><strong>Room ID:</strong> ${event.returnValues.roomId}</p>
<p><strong>Tên phòng:</strong> ${event.returnValues.name}</p>
<p><strong>Chủ phòng:</strong> ${event.returnValues.owner}</p>
<hr>
`;
document.getElementById("events").innerHTML += eventData;
})
.on("error", error => {
console.error("❌ WebSocket Error:", error);
});
}
</script>
</body>
</html>