Files
nostrdvm/ui/noogle/src/components/helper/Helper.vue
2024-03-08 08:27:48 +01:00

315 lines
9.1 KiB
Vue

<script>
import {defineComponent} from 'vue'
import store from "@/store";
import amberSignerService from "@/components/android-signer/AndroidSigner";
import {Duration, Event, EventBuilder, EventId, Filter, Keys, PublicKey, Tag, Timestamp} from "@rust-nostr/nostr-sdk";
import miniToastr from "mini-toastr/mini-toastr";
import VueNotifications from "vue-notifications";
export default defineComponent({
name: "posting"
})
export async function post_note(note){
let client = store.state.client
let tags = []
if (localStorage.getItem('nostr-key-method') === 'android-signer') {
const draft = {
content: note,
kind: 1,
pubkey: store.state.pubkey.toHex(),
tags: tags,
createdAt: Date.now()
};
const eventJson = await amberSignerService.signEvent(draft);
await client.sendEvent(Event.fromJson(JSON.stringify(eventJson)));
}
else
{
await client.publishTextNote(note, tags);
}
}
export async function schedule(note, datetopost) {
let schedule = Timestamp.fromSecs(datetopost/1000)
let humandatetime = schedule.toHumanDatetime()
let time = humandatetime.split("T")[1].split("Z")[0].trim()
let date = humandatetime.split("T")[0].split("-")[2].trim() + "." + humandatetime.split("T")[0].split("-")[1].trim() + "." + humandatetime.split("T")[0].split("-")[0].trim().slice(2)
console.log("Date: " + date + " Time: "+ time )
let client = store.state.client
let signer = store.state.signer
let noteevent = EventBuilder.textNote(note, []).customCreatedAt(schedule).toUnsignedEvent(store.state.pubkey)
let signedEvent = await signer.signEvent(noteevent)
let stringifiedevent = signedEvent.asJson()
let tags_str = []
let tag = Tag.parse(["i", stringifiedevent, "text"])
tags_str.push(tag.asVec())
let tags_as_str = JSON.stringify(tags_str)
let content = await signer.nip04Encrypt(PublicKey.parse("85c20d3760ef4e1976071a569fb363f4ff086ca907669fb95167cdc5305934d1"), tags_as_str)
let tags_t = []
tags_t.push(Tag.parse(["p", "85c20d3760ef4e1976071a569fb363f4ff086ca907669fb95167cdc5305934d1"]))
tags_t.push(Tag.parse(["encrypted"]))
tags_t.push(Tag.parse(["client", "noogle"]))
let evt = new EventBuilder(5905, content, tags_t)
console.log(evt)
let res = await client.sendEventBuilder(evt);
console.log(res)
miniToastr.showMessage("Note scheduled for " + ("Date: " + date + " Time: "+ time ))
}
export async function getEvents(eventids) {
let ids = []
for (let eid of eventids){
ids.push(EventId.parse(eid))
}
const event_filter = new Filter().ids(ids)
let client = store.state.client
return await client.getEventsOf([event_filter], Duration.fromSecs(5))
}
export async function getEventsOriginalOrder(eventids) {
let ids = []
for (let eid of eventids){
ids.push(EventId.parse(eid))
}
const event_filter = new Filter().ids(ids)
let client = store.state.client
let results = await client.getEventsOf([event_filter], Duration.fromSecs(5))
/*console.log(results.length)
for (let e of results){
console.log(e.id.toHex())
} */
let final = []
for (let f of eventids){
let note = results.find(value => value.id.toHex() === f)
//console.log(note)
final.push(note)
}
return final
}
export function nextInput(e) {
const next = e.currentTarget.nextElementSibling;
if (next) {
next.focus();
}
}
export async function get_user_infos(pubkeys){
let profiles = []
let client = store.state.client
const profile_filter = new Filter().kind(0).authors(pubkeys)
let evts = await client.getEventsOf([profile_filter], Duration.fromSecs(10))
for (const entry of evts){
try{
let contentjson = JSON.parse(entry.content)
//console.log(contentjson)
profiles.push({profile: contentjson, author: entry.author.toHex(), createdAt: entry.createdAt});
}
catch(error){
console.log("error")
}
}
return profiles
}
export const sleep = (ms) => {
return new Promise(resolve => setTimeout(resolve, ms))
}
export async function copyinvoice(invoice){
await navigator.clipboard.writeText(invoice)
window.open("lightning:" + invoice,"_blank")
miniToastr.showMessage("", "Copied Invoice to clipboard", VueNotifications.types.info)
}
export async function copyurl(url){
await navigator.clipboard.writeText(url)
miniToastr.showMessage("", "Copied link to clipboard", VueNotifications.types.info)
}
export async function parseandreplacenpubs(note){
const myArray = note.split(" ");
let finalnote = ""
for (let word in myArray){
if(myArray[word].startsWith("nostr:npub")){
//console.log(myArray[word])
//console.log(pk.toBech32())
try{
let pk = PublicKey.parse(myArray[word].replace("nostr:", ""))
let profiles = await get_user_infos([pk])
//console.log(profiles[0].profile.nip05)
myArray[word] = profiles[0].profile.nip05 // replace with nip05 for now
}
catch{
}
}
finalnote = finalnote + myArray[word] + " "
}
return finalnote.trimEnd()
}
var getHtmlBlock = function(dataType) {
return `<div class="icon negative big toleft" id="cancel-btn"><i class="fas fa-minus-circle"></i></div><div class="icon add big toleft"><i class="fas fa-check-circle"></i></div><input type="text" class="contact-input" style="margin-bottom: 5px;" maxlength="50" name="my-contact-phone" data-name="Name" placeholder="${dataType}">`;
};
export async function parseandreplacenpubsName(note){
const myArray = note.split(" ");
let finalnote = ""
for (let word in myArray){
if(myArray[word].startsWith("nostr:npub")){
//console.log(myArray[word])
//console.log(pk.toBech32())
try{
let pk = PublicKey.parse(myArray[word].replace("nostr:", ""))
let profiles = await get_user_infos([pk])
//console.log(profiles[0].profile.nip05)
myArray[word] = profiles[0].profile.name
// profiles[0].profile.name // replace with nip05 for now
}
catch{
}
}
finalnote = finalnote + myArray[word] + " "
}
return finalnote.trimEnd()
}
export async function zaprequest(lud16, amount, content, zapped_event_id, zapped_user_id, relay_list){
let url = ""
if (lud16.toString().includes('@')){
url = 'https://' + lud16.toString().split('@')[1] + '/.well-known/lnurlp/' + lud16.toString().split('@')[0]
}
else{
return None
}
try{
let response = await fetch(url)
let ob = JSON.parse(response.content)
let callback = ob["callback"]
let encoded_lnurl = "" // lnurl.encode(url)
let amount_tag = Tag.parse(['amount', (amount * 1000).toString()])
let relays_tag = Tag.parse(['relays', (relay_list).toString()])
let lnurl_tag = Tag.parse(['lnurl', encoded_lnurl])
let tags = []
let p_tag = Tag.parse(['p', zapped_user_id])
if (zapped_event_id !== None){
let e_tag = Tag.parse(['e', zapped_event_id])
tags = [amount_tag, relays_tag, p_tag, e_tag, lnurl_tag]
}
else{
tags = [amount_tag, relays_tag, p_tag, lnurl_tag]
}
//todo
/* if zaptype == "private":
key_str = keys.secret_key().to_hex() + zapped_event.id().to_hex() + str(zapped_event.created_at().as_secs())
encryption_key = sha256(key_str.encode('utf-8')).hexdigest()
zap_request = EventBuilder(9733, content,
[p_tag, e_tag]).to_event(keys).as_json()
keys = Keys.parse(encryption_key)
encrypted_content = enrypt_private_zap_message(zap_request, keys.secret_key(), zapped_event.author())
anon_tag = Tag.parse(['anon', encrypted_content])
tags.append(anon_tag)
content = "" */
let client = store.state.client
let zap_request = client.EventBuilder(9734, content,
tags).toSignedEvent().asJson()
response = await fetch(callback + "?amount=" + (Number.parse(amount) * 1000).toString() + "&nostr=" + encodeURI(zap_request) + "&lnurl=" + encoded_lnurl)
ob = JSON.parse(response.content)
return ob["pr"]
}
catch(error){
console.log("ZAP REQUEST: " + e)
}
return None
}
export async function createBolt11Lud16(lud16, amount) {
let url;
if (lud16.includes('@')) { // LNaddress
const parts = lud16.split('@');
url = `https://${parts[1]}/.well-known/lnurlp/${parts[0]}`;
} else { // No lud16 set or format invalid
return null;
}
try {
console.log(url);
const response = await fetch(url);
const ob = await response.json();
const callback = ob.callback;
const amountInSats = parseInt(amount) * 1000;
const callbackResponse = await fetch(`${callback}?amount=${amountInSats}`);
const obCallback = await callbackResponse.json();
return obCallback.pr;
}
catch (e) {
console.log(`LUD16: ${e}`);
return null;
}
}
</script>
<template>
</template>
<style scoped>
</style>