notifications for OBS

This commit is contained in:
hatim boufnichel 2021-04-10 16:22:52 +02:00
parent 22f53fb977
commit 55904176db
7 changed files with 144 additions and 4 deletions

View file

@ -1090,12 +1090,16 @@ const sendSpontaneousPayment = async (
const { num_satoshis: decodedAmt } = await decodePayReq(encodedInvoice) const { num_satoshis: decodedAmt } = await decodePayReq(encodedInvoice)
if (decodedAmt !== amount.toString()) { if (decodedAmt !== amount.toString()) {
throw new Error('Invoice amount mismatch') throw new Error(
`Invoice amount mismatch got: ${decodedAmt} expected: ${amount.toString()}`
)
} }
// double check // double check
if (Number(decodedAmt) !== amount) { if (Number(decodedAmt) !== amount) {
throw new Error('Invoice amount mismatch') throw new Error(
`Invoice amount mismatch got:${decodedAmt} expected:${amount.toString()}`
)
} }
logger.info('Will now send payment through lightning') logger.info('Will now send payment through lightning')

View file

@ -18,6 +18,8 @@ const Utils = require('../utils')
const Gun = require('gun') const Gun = require('gun')
const { selfContentToken, enrollContentTokens } = require('../../../seed') const { selfContentToken, enrollContentTokens } = require('../../../seed')
const TipForwarder = require('../../../tipsCallback')
const getUser = () => require('../../Mediator').getUser() const getUser = () => require('../../Mediator').getUser()
/** /**
@ -278,6 +280,13 @@ const listenerForAddr = (addr, SEA) => async (order, orderID) => {
.get('postToTipCount') .get('postToTipCount')
.get(postID) .get(postID)
.set(null) // each item in the set is a tip .set(null) // each item in the set is a tip
TipForwarder.notifySocketIfAny(
postID,
order.from,
'TIPPED YOU',
amt + ' sats'
)
break break
} }
case 'spontaneousPayment': { case 'spontaneousPayment': {

30
services/tipsCallback.js Normal file
View file

@ -0,0 +1,30 @@
//@ts-nocheck TODO- fix types
class TipsCB {
listeners = {}
addSocket(postID,socket){
console.log("subbing new socket for post: "+postID)
if(!this.listeners[postID]){
this.listeners[postID] = []
}
this.listeners[postID].push(socket)
}
notifySocketIfAny(postID,name,message,amount){
if(!this.listeners[postID]){
return
}
this.listeners[postID].forEach(socket => {
if(!socket.connected){
return
}
socket.emit("update",{
name,message,amount
})
});
}
}
const TipsForwarder = new TipsCB()
module.exports = TipsForwarder

85
src/index.html Normal file
View file

@ -0,0 +1,85 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<style>
html,
body{
height: 100%;
margin: 0;
}
.main{
display: flex;
justify-content: center;
align-items: center;
height: 100%;
}
.content{
font-size: 4rem;
background: #333333;
padding: 1rem;
border-radius: 0.5rem;
display: flex;
flex-direction: column;
align-items: center;
}
#content-name{
color: #FFFFFF;
text-shadow: 0 0 10px #FFFFFF;
margin:0
}
#content-message{
color: #FFFFFF;
text-shadow: 4px 3px 0 #7A7A7A;
margin:0
}
#content-amount{
color: #FFFFFF;
text-shadow: 0 -1px 4px #FFF, 0 -2px 10px #ff0, 0 -10px 20px #ff8000, 0 -18px 40px #F00;
margin:0
}
.hide{
display:none
}
</style>
<script src="https://cdnjs.cloudflare.com/ajax/libs/socket.io/4.0.1/socket.io.js" integrity="sha512-q/dWJ3kcmjBLU4Qc47E4A9kTB4m3wuTY7vkFJDTZKjTs8jhyGQnaUrxa0Ytd0ssMZhbNua9hE+E7Qv1j+DyZwA==" crossorigin="anonymous"></script>
</head>
<body>
<div class="main">
<div class="content hide">
<p id="content-name">fdsigfudfsbigbfduigbdfb</p>
<p id="content-message">JUST TIPPED YOU!</p>
<p id="content-amount">100sats</p>
</div>
</div>
<script>
console.log(location.origin)
const queryString = window.location.search;
const urlParams = new URLSearchParams(queryString);
const postID = urlParams.get("postID")
var socket = io(`${location.origin}/streams`);
socket.emit("postID",postID)
let latestTimeout = null
socket.on("update",(update)=>{
const name = document.querySelector("#content-name")
name.innerHTML = update.name
const message = document.querySelector("#content-message")
message.innerHTML = update.message
const amount = document.querySelector("#content-amount")
amount.innerHTML = update.amount
const content = document.querySelector(".content")
content.classList.remove("hide")
clearTimeout(latestTimeout)
latestTimeout = setTimeout(()=>{
content.classList.add("hide")
},5000)
})
</script>
</body>
</html>

View file

@ -15,6 +15,7 @@ const isARealUsableNumber = require('lodash/isFinite')
const Big = require('big.js') const Big = require('big.js')
const size = require('lodash/size') const size = require('lodash/size')
const { range, flatten, evolve } = require('ramda') const { range, flatten, evolve } = require('ramda')
const path = require('path')
const getListPage = require('../utils/paginate') const getListPage = require('../utils/paginate')
const auth = require('../services/auth/auth') const auth = require('../services/auth/auth')
@ -3271,4 +3272,7 @@ module.exports = async (
}) })
} }
}) })
ap.get('/api/subscribeStream', (req, res) => {
res.sendFile(path.join(__dirname, '/index.html'))
})
} }

View file

@ -19,6 +19,7 @@ const { deepDecryptIfNeeded } = require('../services/gunDB/rpc')
const GunEvents = require('../services/gunDB/contact-api/events') const GunEvents = require('../services/gunDB/contact-api/events')
const SchemaManager = require('../services/schema') const SchemaManager = require('../services/schema')
const { encryptedEmit, encryptedOn } = require('../utils/ECC/socket') const { encryptedEmit, encryptedOn } = require('../utils/ECC/socket')
const TipsForwarder = require('../services/tipsCallback')
/** /**
* @typedef {import('../services/gunDB/Mediator').SimpleSocket} SimpleSocket * @typedef {import('../services/gunDB/Mediator').SimpleSocket} SimpleSocket
* @typedef {import('../services/gunDB/contact-api/SimpleGUN').ValidDataValue} ValidDataValue * @typedef {import('../services/gunDB/contact-api/SimpleGUN').ValidDataValue} ValidDataValue
@ -685,6 +686,12 @@ module.exports = (
emit('$error', e.message) emit('$error', e.message)
} }
}) })
io.of('streams').on('connect', socket => {
console.log('a user connected')
socket.on('postID', postID => {
TipsForwarder.addSocket(postID, socket)
})
})
return io return io
} }

View file

@ -9,7 +9,8 @@ module.exports = {
"/api/lnd/wallet/status": true, "/api/lnd/wallet/status": true,
"/api/lnd/auth": true, "/api/lnd/auth": true,
// //
"/api/gun/auth": true "/api/gun/auth": true,
"/api/subscribeStream":true,
}, },
POST: { POST: {
"/api/lnd/connect": true, "/api/lnd/connect": true,
@ -31,5 +32,5 @@ module.exports = {
PUT: {}, PUT: {},
DELETE: {} DELETE: {}
}, },
nonEncryptedRoutes: ['/api/security/exchangeKeys', "/api/encryption/exchange", '/healthz', '/ping', '/api/lnd/wallet/status', '/api/gun/auth'] nonEncryptedRoutes: ['/api/security/exchangeKeys', "/api/encryption/exchange", '/healthz', '/ping', '/api/lnd/wallet/status', '/api/gun/auth',"/api/subscribeStream"]
} }