diff --git a/src/HTTP/JS/BlueskyAPI.js b/src/HTTP/JS/BlueskyAPI.js
index dae55a9..ba7ba59 100644
--- a/src/HTTP/JS/BlueskyAPI.js
+++ b/src/HTTP/JS/BlueskyAPI.js
@@ -100,6 +100,24 @@ export async function GetPosts(URIs) {
return body;
}
+export async function GetFollows(Actor) {
+ if (Token == null) {
+ return "";
+ }
+ let FetchThing = localStorage.getItem(Variables.BlueskyPDS) + "/xrpc/app.bsky.graph.getFollows?actor=" + Actor;
+ let DPoP = await ClientDPoPPDS("GET", FetchThing);
+ let request = fetch(FetchThing, { method: "GET", headers: {"Authorization": "DPoP " + Token, "DPoP": DPoP}});
+ let body = await request.then((response) => response.json());
+ let status = await request.then((response) => response.status);
+ let header = await request.then((response) => response.headers.get("dpop-nonce"));
+ if (status == 401) {
+ await HandleError(body, header);
+ body = await GetPosts(URIs);
+ }
+ return body;
+}
+
+// Gets the parent. Gets the replies. Also gets the post shit.
export async function GetPostThread(URI) {
if (Token == null) {
return "";
@@ -149,7 +167,7 @@ export async function GetRecord(Repo, Collection, RKey) {
// Creators
// This creates a post. Requires the DID of the account and the Text for the record.
-export async function CreatePost(DID, Text, ContentWarning = undefined, Tags = [], ReplyID = undefined, RootID = undefined) {
+export async function CreatePost(DID, Text, ContentWarning = undefined, Tags = [], ReplyID = undefined, RootID = undefined, AddTags = false) {
if (Token == null) {
return "";
}
@@ -184,6 +202,24 @@ export async function CreatePost(DID, Text, ContentWarning = undefined, Tags = [
if (Tags.length != 0) {
Record.tags = Tags;
}
+ if (AddTags == true) {
+ let Facets = [];
+ let LengthStuff = 0;
+ for (let i of Tags) {
+ Facets.push({
+ "index": {
+ "byteStart": LengthStuff,
+ "byteEnd": LengthStuff + i.length
+ },
+ "features": [{
+ "$type": "app.bsky.richtext.facet#tag",
+ "tag": i
+ }]
+ });
+ LengthStuff = LengthStuff + i.length + 1;
+ }
+ Record.facets = Facets;
+ }
let body = await CreateRecord(DID, "app.bsky.feed.post", Record, undefined);
if (body.hasOwnProperty("error") && body.error == "InvalidRequest") {
let matches = body.message.match(/(\d+)/);
diff --git a/src/HTTP/JS/MastodonAPI.js b/src/HTTP/JS/MastodonAPI.js
index b950692..1daa4be 100644
--- a/src/HTTP/JS/MastodonAPI.js
+++ b/src/HTTP/JS/MastodonAPI.js
@@ -57,24 +57,6 @@ export async function GetRelationship(ID) {
.then((response) => response.json());
}
-// Gets the favorites of a user that you have access to.
-export async function GetFavorites() {
- if (Token == null || TokenType == null) {
- return "";
- }
- return await fetch(localStorage.getItem(Variables.MastodonWebsite) + "/api/v1/favourites", {method: "GET", headers: {"Authorization": TokenType + " " + Token}})
- .then((response) => response.json());
-}
-
-// Gets the bookmarks of a user that you have access to.
-export async function GetBookmarks() {
- if (Token == null || TokenType == null) {
- return "";
- }
- return await fetch(localStorage.getItem(Variables.MastodonWebsite) + "/api/v1/bookmarks", {method: "GET", headers: {"Authorization": TokenType + " " + Token}})
- .then((response) => response.json());
-}
-
// Gets the notifications of a user that you have access to.
export async function GetNotifications() {
if (Token == null || TokenType == null) {
@@ -111,11 +93,11 @@ export async function GetOwnAccount() {
}
// Get your own account blocks.
-export async function GetOwnAccountBlocks() {
+export async function GetAccountFollows(ID) {
if (Token == null || TokenType == null) {
return "";
}
- return await fetch(localStorage.getItem(Variables.MastodonWebsite) + "/api/v1/blocks/", {method: "GET", headers: {"Authorization": TokenType + " " + Token}})
+ return await fetch(localStorage.getItem(Variables.MastodonWebsite) + "/api/v1/accounts/" + ID + "/following", {method: "GET", headers: {"Authorization": TokenType + " " + Token}})
.then((response) => response.json());
}
diff --git a/src/HTTP/JS/account.js b/src/HTTP/JS/account.js
index 62dc8d1..1e92f9c 100644
--- a/src/HTTP/JS/account.js
+++ b/src/HTTP/JS/account.js
@@ -18,7 +18,7 @@ let AlternateAccountDescription = document.getElementsByClassName("AccountDescri
let FollowButton = document.getElementsByClassName("Follow")[0];
let BlockButton = document.getElementsByClassName("Block")[0];
-let AccountPosts = document.getElementsByClassName("Posts")[0];
+let AccountPosts = document.getElementsByClassName("Posts")[1];
// Other vars.
let Following = false;
@@ -126,10 +126,10 @@ async function GetAccount() {
AccountImage.setAttribute("src", account.avatar);
// Get their recent posts. Determine if they are cewl or not.
let Posts = await BlueskyAPI.GetProfileFeed(account.did);
- console.log(Posts);
for (let i of Posts.feed) {
AccountPosts.innerHTML += i.post.record.text + "
";
}
+ // No other accounts. Just you.
} else {
FollowButton.setAttribute("hidden", "");
BlockButton.setAttribute("hidden", "");
@@ -151,12 +151,27 @@ async function GetAccount() {
}
Token = localStorage.getItem(Variables.BlueskyAccessToken);
if (Token != null) {
+ // Mastodon stuff.
+ let MastoProfile = await MastodonAPI.GetOwnAccount();
+ // Get my followings on Mastodon.
+ let MyMastodonFollows = await MastodonAPI.GetAccountFollows(MastoProfile.id);
+ document.getElementsByClassName("Posts")[0].innerHTML += "FOLLOWS:
";
+ for (let i of MyMastodonFollows) {
+ document.getElementsByClassName("Posts")[0].innerHTML += i.acct + "
";
+ }
+ // Bluesky stuff.
let BlueProfile = await BlueskyAPI.GetProfile(localStorage.getItem(Variables.BlueskyDID));
AlternateAccountImage.setAttribute("width", "20%");
AlternateAccountImage.setAttribute("height", "20%");
AlternateAccountName.innerHTML = BlueProfile.handle;
AlternateAccountDescription.innerHTML = BlueProfile.description;
AlternateAccountImage.setAttribute("src", BlueProfile.avatar);
+ // Get my followings on Bsky
+ let MyBlueskyFollows = await BlueskyAPI.GetFollows(localStorage.getItem(Variables.BlueskyDID));
+ AccountPosts.innerHTML += "FOLLOWS:
";
+ for (let i of MyBlueskyFollows.follows) {
+ AccountPosts.innerHTML += i.handle + "
";
+ }
}
}
diff --git a/src/HTTP/JS/expanded.js b/src/HTTP/JS/expanded.js
index 82ca172..e22eb6b 100644
--- a/src/HTTP/JS/expanded.js
+++ b/src/HTTP/JS/expanded.js
@@ -19,6 +19,14 @@ let post = JSON.parse(localStorage.getItem("post"));
let ThreadedPost = [];
document.getElementsByClassName("Origin")[0].innerHTML = website;
+
+// Other post stuff.
+for (let i of document.getElementsByClassName("Handle")) {
+ i.onclick = (event) => {
+ window.location.href = "/account?website=" + website;
+ }
+}
+
GetPost();
// Fixes a bug where the interpreter sucks ass.
@@ -63,15 +71,6 @@ Reply.onclick = (event) => {
window.location.href = "/post?website=" + website;
}
-// Other post stuff.
-for (let i of document.getElementsByClassName("Regular")) {
- i.onclick = (event) => {
- if (i.classList.contains("Handle")) {
- window.location.href = "/account?website=" + website;
- }
- }
-}
-
// Threads are the thing above the post you clicked.
async function SetThreadPost(element, i) {
if (website == "Mastodon") {
@@ -114,7 +113,7 @@ async function GetPost() {
let NumberOfThreads = 0;
let TemporaryPost = post;
while (TemporaryPost.in_reply_to_id != null) {
- TemporaryPost = await MastodonThreadFunction(NumberOfThreads, TemporaryPost.in_reply_to_id);
+ TemporaryPost = await MastodonOtherFunction(NumberOfThreads, TemporaryPost.in_reply_to_id, true);
ThreadedPost.push(TemporaryPost);
// Any posts? Give them the thing :3
for (let i of document.getElementsByClassName(NumberOfThreads)) {
@@ -128,7 +127,7 @@ async function GetPost() {
// Replies, anyone?
let Context = await MastodonAPI.GetContexts(post.id);
for (let i of Context.descendants) {
- TemporaryPost = await MastodonReplyFunction(NumberOfThreads, i);
+ TemporaryPost = await MastodonOtherFunction(NumberOfThreads, i, false);
ThreadedPost.push(TemporaryPost);
// Any posts? Give them the thing :3
for (let j of document.getElementsByClassName(NumberOfThreads)) {
@@ -171,7 +170,7 @@ async function GetPost() {
let NumberOfThreads = 0;
let TemporaryPost = post;
while (TemporaryPost.hasOwnProperty("reply")) {
- TemporaryPost = await BlueskyThreadFunction(NumberOfThreads, TemporaryPost.reply.parent);
+ TemporaryPost = await BlueskyOtherFunction(NumberOfThreads, TemporaryPost.reply.parent, true);
ThreadedPost.push(TemporaryPost);
// Any posts? Give them the thing :3
for (let i of document.getElementsByClassName(NumberOfThreads)) {
@@ -184,9 +183,8 @@ async function GetPost() {
}
// Replies, anyone?
let Context = await BlueskyAPI.GetPostThread(post.post.uri);
- console.log(Context);
for (let i of Context.thread.replies) {
- TemporaryPost = await BlueskyReplyFunction(NumberOfThreads, i);
+ TemporaryPost = await BlueskyOtherFunction(NumberOfThreads, i.post, false);
ThreadedPost.push(TemporaryPost);
// Any posts? Give them the thing :3
for (let j of document.getElementsByClassName(NumberOfThreads)) {
@@ -203,10 +201,19 @@ async function GetPost() {
}
// Because of repeat code, we can put it into it's own function. It grabs posts "above" it.
-async function MastodonThreadFunction(Id, post) {
- let OtherPost = await MastodonAPI.GetStatus(post);
+async function MastodonOtherFunction(Id, post, IsThread) {
+ let OtherPost;
+ if (IsThread == true) {
+ OtherPost = await MastodonAPI.GetStatus(post);
+ } else {
+ OtherPost = post;
+ }
let ShitHTML = "
" + OtherPost.account.acct + "
" + website + "
";
- document.getElementsByTagName("body")[0].insertAdjacentHTML("afterbegin", ShitHTML);
+ if (IsThread == true) {
+ document.getElementsByTagName("body")[0].insertAdjacentHTML("afterbegin", ShitHTML);
+ } else {
+ document.getElementsByTagName("body")[0].insertAdjacentHTML("beforeend", ShitHTML);
+ }
if (OtherPost.spoiler_text != "") {
document.getElementsByClassName("PostText " + Id)[0].innerHTML = "WARNING: " + OtherPost.spoiler_text;
} else {
@@ -220,28 +227,16 @@ async function MastodonThreadFunction(Id, post) {
return OtherPost;
}
-async function MastodonReplyFunction(Id, post) {
- let ShitHTML = "
" + post.account.acct + "
" + website + "
";
- document.getElementsByTagName("body")[0].insertAdjacentHTML("beforeend", ShitHTML);
- if (post.spoiler_text != "") {
- document.getElementsByClassName("PostText " + Id)[0].innerHTML = "WARNING: " + post.spoiler_text;
- } else {
- document.getElementsByClassName("PostText " + Id)[0].innerHTML = post.content;
- if (post.media_attachments.length != 0) {
- for (let i of post.media_attachments) {
- ApplyMedia(i, document.getElementsByClassName("Images " + Id));
- }
- }
- }
- return post;
-}
-
// Because of repeat code, we can put it into it's own function. It grabs posts "above" it.
-async function BlueskyThreadFunction(Id, post) {
+async function BlueskyOtherFunction(Id, post, IsThread) {
let OtherPost = await BlueskyAPI.GetPosts([post.uri]);
OtherPost = OtherPost.posts[0];
let ShitHTML = "
" + OtherPost.author.handle + "
" + website + "
";
- document.getElementsByTagName("body")[0].insertAdjacentHTML("afterbegin", ShitHTML);
+ if (IsThread == true) {
+ document.getElementsByTagName("body")[0].insertAdjacentHTML("afterbegin", ShitHTML);
+ } else {
+ document.getElementsByTagName("body")[0].insertAdjacentHTML("beforeend", ShitHTML);
+ }
Text = BlueskyAPI.ApplyFacets(OtherPost.record, OtherPost.record.text);
Text = Text.replace(/\r?\n|\r/g, "
");
// Sensitive topic :3
@@ -263,26 +258,6 @@ async function BlueskyThreadFunction(Id, post) {
return OtherPost;
}
-async function BlueskyReplyFunction(Id, post) {
- let ShitHTML = "
" + post.post.author.handle + "
" + website + "
";
- document.getElementsByTagName("body")[0].insertAdjacentHTML("beforeend", ShitHTML);
- Text = BlueskyAPI.ApplyFacets(post.post.record, post.post.record.text);
- Text = Text.replace(/\r?\n|\r/g, "
");
- // Sensitive topic :3
- if (post.post.record.hasOwnProperty("labels") && post.post.record.labels.length != 0) {
- document.getElementsByClassName("PostText " + Id)[0].innerHTML = "LABELS APPLIED: ";
- for (let lab of post.post.value.labels.values) {
- document.getElementsByClassName("PostText " + Id)[0].innerHTML += lab.val + " ";
- }
- } else {
- document.getElementsByClassName("PostText " + Id)[0].innerHTML = Text;
- if (post.post.record.hasOwnProperty("embed")) {
- ApplyMedia(post.post.record.embed, document.getElementsByClassName("Images " + Id)[0], post.post.author.did);
- }
- }
- return post;
-}
-
// Applyers. Essentially applies a thing to an operation.
// Finds any associated media and applies it to the post.
async function ApplyMedia(Media, Element, Author = undefined) {
diff --git a/src/HTTP/JS/index.js b/src/HTTP/JS/index.js
index 8b2347e..6776113 100644
--- a/src/HTTP/JS/index.js
+++ b/src/HTTP/JS/index.js
@@ -231,10 +231,10 @@ async function PosterContainerUpdate(Direction) {
// Put the reblog into the regular post; Make changes as necessary.
if (MastodonLoadedFeed[CurrentThing + counter].reblog != null && typeof MastodonLoadedFeed[CurrentThing + counter].reblog != "string") {
// Fix a reblog issue.
+ i.getElementsByClassName("Username")[0].innerHTML = MastodonLoadedFeed[CurrentThing + counter].reblog.account.acct + " ( R: " + MastodonLoadedFeed[CurrentThing + counter].account.acct + " )";
let ReblogFix = MastodonLoadedFeed[CurrentThing + counter].account.acct;
MastodonLoadedFeed[CurrentThing + counter] = MastodonLoadedFeed[CurrentThing + counter].reblog;
MastodonLoadedFeed[CurrentThing + counter].reblog = ReblogFix;
- i.getElementsByClassName("Username")[0].innerHTML = ReblogFix + " ( R: " + MastodonLoadedFeed[CurrentThing + counter].reblog + " )";
} else if (MastodonLoadedFeed[CurrentThing + counter].reblog != null && typeof MastodonLoadedFeed[CurrentThing + counter].reblog == "string") {
// this function is if the changes are already made.
i.getElementsByClassName("Username")[0].innerHTML = MastodonLoadedFeed[CurrentThing + counter].account.acct + " ( R: " + MastodonLoadedFeed[CurrentThing + counter].reblog + " )";
diff --git a/src/HTTP/JS/mail.js b/src/HTTP/JS/mail.js
index 8fd6611..a1c18e0 100644
--- a/src/HTTP/JS/mail.js
+++ b/src/HTTP/JS/mail.js
@@ -4,29 +4,7 @@ import * as TumblrAPI from "/JS/TumblrAPI.js";
import * as Variables from "/JS/Variables.js";
// Below is the thing it populates if you login.
-async function PopulateFavorites() {
- let Favorites = await MastodonAPI.GetFavorites();
-
- let FavoritesArea = document.getElementsByClassName("Favorites")[0];
- // Populate the favorites area.
- for (let i in Favorites) {
- FavoritesArea.innerHTML += "
";
- FavoritesArea.getElementsByClassName("Favorite")[i].innerHTML = Favorites[i].content;
- }
-}
-
-async function PopulateBookmarks() {
- let Bookmarks = await MastodonAPI.GetBookmarks();
-
- let BookmarksArea = document.getElementsByClassName("Bookmarks")[0];
- // Populate the Bookmarks area.
- for (let i in Bookmarks) {
- BookmarksArea.innerHTML += "
";
- BookmarksArea.getElementsByClassName("Bookmark")[i].innerHTML = Bookmarks[i].content;
- }
-}
-
-async function PopulateNotifications() {
+async function PopulateMastodonNotifications() {
let Notifications = await MastodonAPI.GetNotifications();
let NotificationsArea = document.getElementsByClassName("Notifications")[0];
@@ -38,9 +16,7 @@ async function PopulateNotifications() {
}
// Populate the areas.
-PopulateFavorites();
-PopulateBookmarks();
-PopulateNotifications();
+PopulateMastodonNotifications();
// Functions stolen elsewhere
// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/random
diff --git a/src/HTTP/JS/post.js b/src/HTTP/JS/post.js
index c760c5f..74df905 100644
--- a/src/HTTP/JS/post.js
+++ b/src/HTTP/JS/post.js
@@ -82,6 +82,7 @@ async function Post() {
}
// Bluesky posting.
if (localStorage.getItem(Variables.BlueskyAccessToken) != null) {
+ let Post;
let TempVisible;
// Adding tags
let Tags = TagsInputArea.value.split(";");
@@ -111,7 +112,6 @@ async function Post() {
break;
}
if (website == "Bluesky") {
- let Post;
if (JSON.parse(localStorage.getItem("post")).hasOwnProperty("reply")) {
if (WarningInputArea.value == "") {
Post = await BlueskyAPI.CreatePost(localStorage.getItem(Variables.BlueskyDID), Text, undefined, Tags, JSON.parse(localStorage.getItem("post")).post, JSON.parse(localStorage.getItem("post")).reply.root);
@@ -132,7 +132,6 @@ async function Post() {
TagsInputArea.value = "";
return;
} else if (website == "All") {
- let Post;
if (WarningInputArea.value == "") {
Post = await BlueskyAPI.CreatePost(localStorage.getItem(Variables.BlueskyDID), Text, undefined, Tags);
} else {
@@ -140,6 +139,20 @@ async function Post() {
}
await BlueskyAPI.CreateThreadGate(localStorage.getItem(Variables.BlueskyDID), Post.uri, TempVisible);
}
+ // Try to apply tags as well in another post because Bsky sucks balls.
+ if (Tags != "") {
+ let Textures = "";
+ for (let i of Tags) {
+ Textures = Textures + i + " ";
+ }
+ Post = await BlueskyAPI.GetPosts([Post.uri]);
+ Post = await Post.posts[0];
+ if (Post.hasOwnProperty("reply")) {
+ await BlueskyAPI.CreatePost(localStorage.getItem(Variables.BlueskyDID), Textures, undefined, Tags, Post, Post.reply.root, true);
+ } else {
+ await BlueskyAPI.CreatePost(localStorage.getItem(Variables.BlueskyDID), Textures, undefined, Tags, Post, Post, true);
+ }
+ }
}
// Youtube posting.
if (YoutubePoser.checked == true) {