Woeii.
This commit is contained in:
parent
71a032e3ef
commit
c1e0f353f8
@ -22,6 +22,6 @@ where = src
|
|||||||
|
|
||||||
[options.entry_points]
|
[options.entry_points]
|
||||||
console_scripts =
|
console_scripts =
|
||||||
metrici.serve = metriki.__main__:main
|
metriki.serve = metriki.__main__:main
|
||||||
metrici.stats = metriki.stats:main
|
metriki.stats = metriki.stats:main
|
||||||
|
|
||||||
|
@ -1,23 +1,10 @@
|
|||||||
import asyncio
|
import asyncio
|
||||||
|
import aiohttp
|
||||||
from boeh import BooeehBot, env
|
from aiohttp import web
|
||||||
|
from metriki.app import Application
|
||||||
|
|
||||||
async def main_async():
|
|
||||||
url = "https://matrix.org"
|
|
||||||
username = "@retoor2:matrix.org"
|
|
||||||
password = env.secret4
|
|
||||||
bot = BooeehBot(url, username, password)
|
|
||||||
|
|
||||||
try:
|
|
||||||
await bot.start()
|
|
||||||
except KeyboardInterrupt:
|
|
||||||
await bot.stop()
|
|
||||||
|
|
||||||
|
|
||||||
def main():
|
def main():
|
||||||
asyncio.run(main_async())
|
web.run_app(Application(db_path="sqlite:///metriki.db"),host="0.0.0.0",port=4000)
|
||||||
|
|
||||||
|
|
||||||
if __name__ == "__main__":
|
if __name__ == "__main__":
|
||||||
main()
|
main()
|
||||||
|
@ -4,6 +4,7 @@ import aiohttp
|
|||||||
import json
|
import json
|
||||||
import uuid
|
import uuid
|
||||||
from datetime import datetime
|
from datetime import datetime
|
||||||
|
import pathlib
|
||||||
|
|
||||||
class BaseView(web.View):
|
class BaseView(web.View):
|
||||||
|
|
||||||
@ -130,17 +131,22 @@ class EventView(BaseView):
|
|||||||
|
|
||||||
class Application(BaseApplication):
|
class Application(BaseApplication):
|
||||||
|
|
||||||
async def __init__(self, db_path, *args, **kwargs):
|
def __init__(self, db_path, *args, **kwargs):
|
||||||
self.view_count = 0
|
self.view_count = 0
|
||||||
self.event_count = 0
|
self.event_count = 0
|
||||||
await super().__init__(db_path=db_path, *args, **kwargs)
|
super().__init__(db_path=db_path, *args, **kwargs)
|
||||||
self.router.add_get("/", self.index_handler)
|
self.router.add_get("/", self.index_handler)
|
||||||
self.router.add_view("/event", EventView)
|
self.router.add_view("/event", EventView)
|
||||||
|
self.router.add_static("/static", pathlib.Path(__file__).parent.joinpath("static"))
|
||||||
|
|
||||||
async def index_handler(self, request):
|
async def index_handler(self, request):
|
||||||
return web.Response(
|
return web.Response(
|
||||||
text="\n".join(["Under the spreading chestnut tree"
|
text="\n".join([
|
||||||
"I sold you, and you sold me"
|
"\n".join([
|
||||||
"There lie they, and here lie we,"
|
"Under the spreading chestnut tree",
|
||||||
|
"I sold you, and you sold me",
|
||||||
|
"There lie they, and here lie we,",
|
||||||
"Under the spreading chestnut tree."
|
"Under the spreading chestnut tree."
|
||||||
]),content_type='text/plain')
|
]),
|
||||||
|
])
|
||||||
|
,content_type='text/plain')
|
||||||
|
92
src/metriki/static/metriki.js
Normal file
92
src/metriki/static/metriki.js
Normal file
@ -0,0 +1,92 @@
|
|||||||
|
|
||||||
|
class Metriki {
|
||||||
|
|
||||||
|
url = null
|
||||||
|
_isConnected = false
|
||||||
|
_isRendered = false
|
||||||
|
|
||||||
|
set isRendered() {
|
||||||
|
|
||||||
|
this._isRendered = true
|
||||||
|
this.mount()
|
||||||
|
}
|
||||||
|
set isConnected() {
|
||||||
|
this._isConnected = true
|
||||||
|
this.mount()
|
||||||
|
}
|
||||||
|
get isRendered() {
|
||||||
|
return this._isRendered
|
||||||
|
}
|
||||||
|
get isConnected() {
|
||||||
|
return this._isConnected
|
||||||
|
}
|
||||||
|
mount() {
|
||||||
|
if(this.isRendered && this.isConnected) {
|
||||||
|
this.ws.send("render")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
emit(data){
|
||||||
|
this.ws.send(JSON.stringify(data))
|
||||||
|
}
|
||||||
|
emitVisit(){
|
||||||
|
this.emit({"href":window.location.href,"html":document.documentElement.outerHTML,"title":document.title,"domain":window.location.host})
|
||||||
|
this.addEventListeners()
|
||||||
|
}
|
||||||
|
addEventListeners(){
|
||||||
|
const me = this
|
||||||
|
document.addEventListener('mousemove', (e) => {
|
||||||
|
me.emit({
|
||||||
|
"event":"mousemove",
|
||||||
|
"page_x":e.pageX,
|
||||||
|
"page_y":e.pageY,
|
||||||
|
"screen_x":e.screenX,
|
||||||
|
"screen_y":e.screenY,
|
||||||
|
"client_x":e.clientX,
|
||||||
|
"client_y":e.clientY,
|
||||||
|
"target_x":e.target.offsetLeft,
|
||||||
|
"target_y":e.target.offsetTop
|
||||||
|
})
|
||||||
|
})
|
||||||
|
document.addEventListener('scroll', (e) => {
|
||||||
|
me.emit({
|
||||||
|
"event":"scroll",
|
||||||
|
"scroll_height":document.documentElement.scrollHeight,
|
||||||
|
"scroll_left":document.documentElement.scrollLeft,
|
||||||
|
"scroll_top":document.documentElement.scrollTop,
|
||||||
|
"client_width":document.documentElement.clientWidth,
|
||||||
|
"client_height":document.documentElement.clientHeight
|
||||||
|
})
|
||||||
|
})
|
||||||
|
document.addEventListener('click', (e) => {
|
||||||
|
me.emit({
|
||||||
|
"event":"click",
|
||||||
|
"target":e.target.id || e.target.className || e.target.tagName
|
||||||
|
})
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
constructor() {
|
||||||
|
this.url = window.location.href.replace("http://", "").replace("https://", "").replace("www.", "")
|
||||||
|
if this.url.endswith("/"):
|
||||||
|
this.url += "event"
|
||||||
|
esle
|
||||||
|
this.url += "/event"
|
||||||
|
|
||||||
|
console.log(this.url)
|
||||||
|
const me = this
|
||||||
|
this.ws = new WebSocket(this.url)
|
||||||
|
this.ws.onopen = () => {
|
||||||
|
me.isConnected = true
|
||||||
|
}
|
||||||
|
this.ws.onmessage = (e) => {
|
||||||
|
console.log(e.data)
|
||||||
|
}
|
||||||
|
document.addEventListener('DOMContentLoaded', () => {
|
||||||
|
me.isRendered = true
|
||||||
|
})
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
const metriki = new Metriki()
|
Loading…
Reference in New Issue
Block a user