mirror of
				https://git.sr.ht/~tsileo/microblog.pub
				synced 2025-06-05 21:59:23 +02:00 
			
		
		
		
	Add remote interaction button
This commit is contained in:
		
							
								
								
									
										43
									
								
								app/main.py
									
									
									
									
									
								
							
							
						
						
									
										43
									
								
								app/main.py
									
									
									
									
									
								
							| @@ -883,6 +883,48 @@ async def post_remote_follow( | ||||
|     ) | ||||
|  | ||||
|  | ||||
| @app.get("/remote_interaction") | ||||
| async def remote_interaction( | ||||
|     request: Request, | ||||
|     ap_id: str, | ||||
|     db_session: AsyncSession = Depends(get_db_session), | ||||
| ) -> templates.TemplateResponse: | ||||
|     outbox_object = await boxes.get_outbox_object_by_ap_id( | ||||
|         db_session, | ||||
|         ap_id, | ||||
|     ) | ||||
|     if not outbox_object: | ||||
|         raise HTTPException(status_code=404) | ||||
|  | ||||
|     return await templates.render_template( | ||||
|         db_session, | ||||
|         request, | ||||
|         "remote_interact.html", | ||||
|         {"outbox_object": outbox_object}, | ||||
|     ) | ||||
|  | ||||
|  | ||||
| @app.post("/remote_interaction") | ||||
| async def post_remote_interaction( | ||||
|     request: Request, | ||||
|     csrf_check: None = Depends(verify_csrf_token), | ||||
|     profile: str = Form(), | ||||
|     ap_id: str = Form(), | ||||
| ) -> RedirectResponse: | ||||
|     if not profile.startswith("@"): | ||||
|         profile = f"@{profile}" | ||||
|  | ||||
|     remote_follow_template = await get_remote_follow_template(profile) | ||||
|     if not remote_follow_template: | ||||
|         # TODO(ts): error message to user | ||||
|         raise HTTPException(status_code=404) | ||||
|  | ||||
|     return RedirectResponse( | ||||
|         remote_follow_template.format(uri=ap_id), | ||||
|         status_code=302, | ||||
|     ) | ||||
|  | ||||
|  | ||||
| @app.get("/.well-known/webfinger") | ||||
| async def wellknown_webfinger(resource: str) -> JSONResponse: | ||||
|     """Exposes/servers WebFinger data.""" | ||||
| @@ -1179,6 +1221,7 @@ async def robots_file(): | ||||
| Disallow: /followers | ||||
| Disallow: /following | ||||
| Disallow: /admin | ||||
| Disallow: /remote_interaction | ||||
| Disallow: /remote_follow""" | ||||
|  | ||||
|  | ||||
|   | ||||
							
								
								
									
										26
									
								
								app/templates/remote_interact.html
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										26
									
								
								app/templates/remote_interact.html
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,26 @@ | ||||
| {%- import "utils.html" as utils with context -%} | ||||
| {% extends "layout.html" %} | ||||
|  | ||||
| {% block head %} | ||||
| <title>Interact from your instance</title> | ||||
| {% endblock %} | ||||
|  | ||||
| {% block content %} | ||||
| {% include "header.html" %} | ||||
|  | ||||
| <div class="box"> | ||||
|     <h2>Interact with this object</h2> | ||||
| </div> | ||||
|  | ||||
| {{ utils.display_object(outbox_object) }} | ||||
|  | ||||
| <div class="box"> | ||||
|     <form class="form" action="{{ url_for("post_remote_interaction") }}" method="POST"> | ||||
|         {{ utils.embed_csrf_token() }} | ||||
|         <input type="text" name="profile" placeholder="you@instance.tld" autofocus> | ||||
|         <input type="hidden" name="ap_id" value="{{ outbox_object.ap_id }}"> | ||||
|         <input type="submit" value="interact from your instance"> | ||||
|     </form> | ||||
| </div> | ||||
|  | ||||
| {% endblock %} | ||||
| @@ -466,6 +466,16 @@ | ||||
|         <li> | ||||
|             <div><a href="{{ object.url }}"{% if object.is_from_inbox %} rel="nofollow"{% endif %} class="object-permalink u-url u-uid">permalink</a></div> | ||||
|         </li> | ||||
|  | ||||
|         {% if object.is_from_outbox and is_object_page and not is_admin and not request.url.path.startswith("/remote_interaction") %} | ||||
|             <li> | ||||
|                 <a class="label-btn" href="{{ request.url_for("remote_interaction") }}?ap_id={{ object.ap_id }}"> | ||||
|                     interact from your instance | ||||
|                 </a> | ||||
|             </li> | ||||
|         {% endif %} | ||||
|  | ||||
|  | ||||
|         {% if not is_article_mode %} | ||||
|             <li> | ||||
|                 <time class="dt-published" datetime="{{ object.ap_published_at.replace(microsecond=0).isoformat() }}" title="{{ object.ap_published_at.replace(microsecond=0).isoformat() }}">{{ object.ap_published_at | timeago }}</time> | ||||
|   | ||||
		Reference in New Issue
	
	Block a user