diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..264daca --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +*__pycache__ \ No newline at end of file diff --git a/Client/.well-known/interverse b/Client/.well-known/interverse index ac65edd..895f9ea 100644 --- a/Client/.well-known/interverse +++ b/Client/.well-known/interverse @@ -45,7 +45,8 @@ ], "Known Interverse": [ "https://jamespearson.xyz", - "https://tomfasano.net" + "https://tomfasano.net", + "https://retroedge.tech" ] }, diff --git a/Client/helper.js b/Client/helper.js index 059e619..baf6393 100644 --- a/Client/helper.js +++ b/Client/helper.js @@ -1,37 +1,19 @@ -function fetchdata(url,cback){ - var req = new XMLHttpRequest(); - req.open("GET",url,true); - req.addEventListener("load",cback); - req.send(); -} - -function logreq(event){ - console.log("Event:") - console.log(event.target.response) -} - -function parse_news_item(dat){ - var item = {}; - item.title = dat.slice(dat.search("")+7,dat.search("")); - item.description = dat.slice(dat.search("")+13,dat.search("")); - item.url = dat.slice(dat.search("")+6,dat.search(""));; - item.img = dat.slice(dat.search("")+5,dat.search(""));; - return item; +function interverse_data(url,cback){ + url = interverse_proxy+"?url="+url + fetch(url).then((response)=> { + if (!response.ok){ + return {} + } + return response.json(); + }).then((data)=>cback(data)) } -function get_rss_list(data){ - var items = data.split("").splice(1); - return items.map(parse_news_item).reverse(); - - - -} - -//https://davidwalsh.name/query-string-javascript +// https://davidwalsh.name/query-string-javascript function getUrlParameter(name) { name = name.replace(/[\[]/, '\\[').replace(/[\]]/, '\\]'); var regex = new RegExp('[\\?&]' + name + '=([^&#]*)'); var results = regex.exec(location.search); return results === null ? '' : decodeURIComponent(results[1].replace(/\+/g, ' ')); -}; \ No newline at end of file +}; + diff --git a/Client/index.html b/Client/index.html index 64ff20a..685813f 100644 --- a/Client/index.html +++ b/Client/index.html @@ -1,169 +1,250 @@ - - - - - - Interverse - - - - - - -
-
- -
-

- - - -
+ + + +
+
+ +
+

+ + +
-
- +
+
+

+

+
+ +
- -
-

Links

+
> +
-
+ + - - + } + }); + } - \ No newline at end of file + }); + } + \ No newline at end of file diff --git a/Client/widget.html b/Client/widget.html deleted file mode 100644 index 8aadb50..0000000 --- a/Client/widget.html +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/readme.md b/readme.md index 1669e20..b25db2e 100644 --- a/readme.md +++ b/readme.md @@ -4,9 +4,8 @@ [Demo video](https://storage.gabe.rocks/LibreSolutionsNetwork/Interverse%20Demo.mp4) ## A decentralized discovery service that allows you to easily discover like-minded sites. -Interverse aims to enable [small-tech](https://small-tech.org#small-tech-is). -That means + * No complicated software to run (beyond an existing website) * No Cryptocurrency/NFT * Scalable @@ -37,8 +36,10 @@ https://libresolutions.network/Interverse?url=your.website ### Can I create my own client? Please do! -## If you need any help getting started feel free to get in touch with me by e-mailing gabriel@libresolutions.network +If you need any help getting started feel free to get in touch with me by e-mailing gabriel@libresolutions.network +--- +Compatible with [Discover](https://codeberg.org/onasaft/Discover) diff --git a/server/interverse-proxy.py b/server/interverse-proxy.py new file mode 100644 index 0000000..69944a1 --- /dev/null +++ b/server/interverse-proxy.py @@ -0,0 +1,22 @@ +from flask import Flask,request,redirect +import json,requests,time +import simple_cache + + + +app = Flask('interverse-proxy') +cache = simple_cache.Cache() + + + +@app.route("/", methods=['GET']) +def interverse_proxy(): + url = request.args.get('url') + if url == None: + return redirect("https://codeberg.org/gabe/Interverse",307) + return "See Interverse" + data = cache.load_data(url) + return json.dumps(data) + +if __name__ == '__main__': + app.run() \ No newline at end of file diff --git a/server/simple_cache.py b/server/simple_cache.py new file mode 100644 index 0000000..f09ecb9 --- /dev/null +++ b/server/simple_cache.py @@ -0,0 +1,62 @@ +import requests,time,json +ideal_delta = 60*5 #5 minutes + +crawler_header = {'User-agent': 'interverse-crawler','info':'https://libresolutions.network/videos/interverse-demo-1/'} +schemes = ['http://','https://'] +locations = [ + '/.well-known/discover.json', + '/.well-known/interverse', + '/interverse.json', + '/discover.json' + ] + + + +class Cache: + def __init__(self,delta=None): + if delta==None: + self.delta = ideal_delta + else: + self.delta = delta + self.links={} + # link = key:{data,time} + + + def load_data(self,url): + data = None + t = time.time() + if url in self.links: + if t - self.links[url]['time'] <= self.delta: + print(f"Using cached result for {url}") + return self.links[url]['data'] + for s in schemes: + for l in locations: + try: + data = requests.get(s+url+l,headers=crawler_header,timeout=3).json() + if l.find('discover'): + #translate discover to interverse + data = json.loads(json.dumps(data).replace("preview_connections","connection_groups")) + print(f"Interverse connection found at {l}") + t = time.time() + self.links[url] = { + 'time':t, + 'data':data, + } + + return data + except: + pass + if data != None: + t = time.time() + self.links[url] = { + 'time':t, + 'data':data, + } + + if data == None: + #If no data is returned, wait longer before attempting again + self.links[url] = { + 'data':None, + 'time':t+ideal_delta + } + return data