-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathnostr.js
137 lines (117 loc) · 5.2 KB
/
nostr.js
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
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
const pool = new window.NostrTools.SimplePool();
let relays = ["wss://relay.damus.io", "wss://relay.nostr.band", "wss://relay.layer.systems"];
nostrGetZaps();
async function nostrGetZaps() {
let sub = pool.sub([...relays], [
{
kinds: [9735],
limit: 10,
}
])
sub.on('event', data => {
sats = 0;
const createdAt = data.created_at;
let sender = "not found"
let receiver = "not found"
let formattedCreatedAt = new Date(createdAt * 1000).toLocaleString();
for(let i = 0; i < data.tags.length; i++) {
if(data.tags[i][0] == ('p')) {
receiver = data.tags[i][1];
}
if(data.tags[i][0] == ('description')) {
description = JSON.parse(data.tags[i][1]);
sender = description.pubkey;
}
if(data.tags[i][0] == ('bolt11')) {
bolt11 = data.tags[i][1];
// Remove first 4 characters i.e. 'lnbc'
let inputStrWithoutPrefix = bolt11.slice(4);
// Get the number after 'lnbc'
let numberAfterPrefix = parseInt(bolt11.slice(4).match(/\d+/)[0]);
// Get the first letter after the number
let letterAfterNumber = inputStrWithoutPrefix.charAt(inputStrWithoutPrefix.search(/[a-zA-Z]/));
if(letterAfterNumber == 'm') {
sats = Math.round((numberAfterPrefix * 0.001) * 100000000);
} else if(letterAfterNumber == 'u') {
sats = Math.round((numberAfterPrefix * 0.000001) * 100000000);
} else if(letterAfterNumber == 'n') {
sats = Math.round((numberAfterPrefix * 0.000000001) * 100000000);
} else if(letterAfterNumber == 'p') {
sats = Math.round((numberAfterPrefix * 0.000000000001) * 100000000);
}
}
}
let sendernpub = NostrTools.nip19.npubEncode(sender);
let receivernpub = NostrTools.nip19.npubEncode(receiver);
// Create a random div number
const divNumber = Math.floor(Math.random() * 999999);
// Create the outer div with class "card"
const cardDiv = document.createElement("div");
cardDiv.classList.add("card");
// Create the inner div with class "card-body"
const cardBodyDiv = document.createElement("div");
cardBodyDiv.classList.add("card-body");
// Create the sender placeholder h5 element with class "card-title"
const senderH5 = document.createElement("h5");
senderH5.classList.add("card-title");
senderH5.textContent = sendernpub;
senderH5.id = sender+""+divNumber;
// Create the lightning bolt icon element
const lightningIcon = document.createElement("i");
lightningIcon.classList.add("bi", "bi-lightning-fill");
// Create the p element with the satoshi amount and lightning icon
const satoshiP = document.createElement("p");
satoshiP.textContent = "⚡️ " + sats + " sats";
satoshiP.prepend(lightningIcon);
// Create the receiver placeholder h5 element with class "card-title"
const receiverH5 = document.createElement("h5");
receiverH5.classList.add("card-title");
receiverH5.textContent = receivernpub;
receiverH5.id = receiver+""+divNumber;
// Create the date placeholder div element with class "card-date"
const dateDiv = document.createElement("div");
dateDiv.classList.add("card-date");
dateDiv.textContent = formattedCreatedAt;
// Append all the elements together to form the structure
cardBodyDiv.appendChild(senderH5);
cardBodyDiv.appendChild(satoshiP);
cardBodyDiv.appendChild(receiverH5);
cardBodyDiv.appendChild(dateDiv); // add date element
cardDiv.appendChild(cardBodyDiv);
// Insert the card div to the body of the document
document.getElementById('cards').insertBefore(cardDiv, document.getElementById('cards').firstChild);
// Get the username of the sender and receiver
nostrGetUserinfo(sender, divNumber);
nostrGetUserinfo(receiver, divNumber);
})
sub.on('eose', () => {
// sub.unsub()
})
}
async function nostrGetUserinfo(pubkey, divNumber) {
let sub = pool.sub([...relays], [
{
kinds: [0],
authors: [pubkey],
limit: 1
}
])
sub.on('event', data => {
const username = JSON.parse(data.content)['username'];
const displayName = JSON.parse(data.content)['displayName'];
const name = JSON.parse(data.content)['name'];
usernameElement = document.getElementById(pubkey+divNumber);
if (typeof displayName !== "undefined" && displayName !== "") {
usernameElement.textContent = `${displayName}`;
} else if (typeof name !== "undefined" && name !== "") {
usernameElement.textContent = `${name}`;
} else {
if(username !== "undefined" && username !== "") {
usernameElement.textContent = `${username}`;
}
}
})
sub.on('eose', () => {
sub.unsub()
})
}