Updates
This commit is contained in:
parent
fd0695e133
commit
782f3ad500
|
@ -23,9 +23,11 @@ var TransSchemas = {
|
||||||
|
|
||||||
var ApiSchema = {
|
var ApiSchema = {
|
||||||
__All__: {
|
__All__: {
|
||||||
ServerSoftware: { //TODO: Handle this in JsonTransform
|
//ServerId: {
|
||||||
//Mastodon: {__Set__: "Mastodon"},
|
// __All__: "id",
|
||||||
//Misskey: {__Set__: "Misskey"},
|
//},
|
||||||
|
// NOTE: objects that embed cross-server data (e.g. a renote), might get this value assigned wrong for our needs (???)
|
||||||
|
ServerSoftware: {
|
||||||
__All__: {__EvalSet__: "TypeOld"},
|
__All__: {__EvalSet__: "TypeOld"},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
@ -70,6 +72,9 @@ var ApiSchema = {
|
||||||
Mastodon: {__OldOr__: ["display_name", "title"]},
|
Mastodon: {__OldOr__: ["display_name", "title"]},
|
||||||
Misskey: "name",
|
Misskey: "name",
|
||||||
},
|
},
|
||||||
|
//ServerUsername: {
|
||||||
|
// __All__: "username",
|
||||||
|
//},
|
||||||
Type: { // user, bot, group, channel:[normal, server]
|
Type: { // user, bot, group, channel:[normal, server]
|
||||||
Mastodon: {__EvalSet__: `
|
Mastodon: {__EvalSet__: `
|
||||||
if (TreeOld.bot) 'Bot';
|
if (TreeOld.bot) 'Bot';
|
||||||
|
@ -90,12 +95,13 @@ var ApiSchema = {
|
||||||
var ApiEndpoints = {
|
var ApiEndpoints = {
|
||||||
FetchNotes: {
|
FetchNotes: {
|
||||||
Mastodon(Profile) {
|
Mastodon(Profile) {
|
||||||
return `GET api/v1/accounts/${Profile.Id}/statuses`;
|
// Must actually get the id by calling GET api/v1/accounts/lookup?acct=USERNAME, the provided one is glitchy
|
||||||
|
return `GET api/v1/accounts/${Profile.__TreeOld__.id}/statuses`;
|
||||||
},
|
},
|
||||||
Misskey(Profile) {
|
Misskey(Profile) {
|
||||||
return {
|
return {
|
||||||
Method: "POST api/users/show",
|
Method: "POST api/users/notes",
|
||||||
Data: {"username": Profile.Id},
|
Data: {"userId": Profile.Id},
|
||||||
};
|
};
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
@ -112,12 +118,36 @@ var ApiEndpoints = {
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
|
var WebEndpoints = {
|
||||||
|
Note: {
|
||||||
|
Misskey(Note) {
|
||||||
|
//return `SERVER_URL/notes/${Note.ServerId}`;
|
||||||
|
return `SERVER_URL/notes/${Note.__TreeOld__.id}`;
|
||||||
|
},
|
||||||
|
},
|
||||||
|
Profile: {
|
||||||
|
Misskey(Profile) {
|
||||||
|
var Host = Profile.__TreeOld__.host;
|
||||||
|
//return `SERVER_URL/@${Profile.ServerUsername}`;
|
||||||
|
return `SERVER_URL/@${Profile.__TreeOld__.username}`;
|
||||||
|
},
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
function ApiTransform(Data, FromSource, DestType) {
|
function ApiTransform(Data, FromSource, DestType) {
|
||||||
var DataFinal = JsonTransformB(Data, ApiSchema, ApiSchema[DestType], FromSource);
|
var DataFinal = JsonTransformB(Data, ApiSchema, ApiSchema[DestType], FromSource);
|
||||||
LogDebug([Data, DestType, FromSource, DataFinal]);
|
LogDebug([Data, DestType, FromSource, DataFinal]);
|
||||||
return DataFinal;
|
return DataFinal;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
function GetWebUrl(Data, Type) {
|
||||||
|
return (TryStr(Data.Url)
|
||||||
|
? Data.Url
|
||||||
|
: WebEndpoints[Type][Data.ServerSoftware](Data)
|
||||||
|
);
|
||||||
|
//return Data.Url || WebEndpoints[Type][Data.ServerSoftware](Data);
|
||||||
|
};
|
||||||
|
|
||||||
/*
|
/*
|
||||||
var TransParsers = {
|
var TransParsers = {
|
||||||
Mastodon: {
|
Mastodon: {
|
||||||
|
|
22
App/Main.js
22
App/Main.js
|
@ -13,8 +13,8 @@ Present.__Set__ = function __Set__() {
|
||||||
};
|
};
|
||||||
|
|
||||||
var ApiCache = {
|
var ApiCache = {
|
||||||
__Store__(Data, Path/*Key, Where*/) {
|
__Store__(Data, Path) {
|
||||||
eval(`ApiCache.${Path} = Data;`);
|
eval(`ApiCache${JPath(Path)} = Data;`);
|
||||||
},
|
},
|
||||||
__UrlStore__(Data) {
|
__UrlStore__(Data) {
|
||||||
ApiCache.__Store__(Data, `Urls['${Data.Url}']`);
|
ApiCache.__Store__(Data, `Urls['${Data.Url}']`);
|
||||||
|
@ -92,7 +92,7 @@ function HtmlAssignPropper(El, Data) {
|
||||||
var Val = eval(`Data.${Toks[1]}`);
|
var Val = eval(`Data.${Toks[1]}`);
|
||||||
if (Val !== undefined) {
|
if (Val !== undefined) {
|
||||||
if (Key === 'src') {
|
if (Key === 'src') {
|
||||||
Val = MkUrl(Val);
|
Val = MkReqUrl(Val);
|
||||||
};
|
};
|
||||||
El[Key] = Val;
|
El[Key] = Val;
|
||||||
};
|
};
|
||||||
|
@ -115,12 +115,11 @@ function TransNetCall(Data, FromSource, DestType, Proc) {
|
||||||
|
|
||||||
function DisplayProfile(Profile) {
|
function DisplayProfile(Profile) {
|
||||||
Profile = UrlObj(Profile, DisplayProfile);
|
Profile = UrlObj(Profile, DisplayProfile);
|
||||||
//if (Profile) {
|
if (Profile) {
|
||||||
var Window = MkWindow({className: "Profile"});
|
var Window = MkWindow({className: "Profile"});
|
||||||
Window.innerHTML += Templating.ViewProfile(Profile);
|
Window.innerHTML += Templating.ViewProfile(Profile);
|
||||||
// TODO: Handle fetching notes of non-standard profiles like servers timelines
|
|
||||||
DoAsync(FetchNotes, FillTimeline, Profile);
|
DoAsync(FetchNotes, FillTimeline, Profile);
|
||||||
//};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
function FetchNotes(Profile, Proc) {
|
function FetchNotes(Profile, Proc) {
|
||||||
|
@ -158,7 +157,8 @@ function FillTimeline(Notes) {
|
||||||
};
|
};
|
||||||
|
|
||||||
function DisplayThread(Note) {
|
function DisplayThread(Note) {
|
||||||
|
var Window = MkWindow({className: "Thread"});
|
||||||
|
//Window.innerHTML += Templating.ViewNote(Note);
|
||||||
};
|
};
|
||||||
|
|
||||||
function FillHome() {
|
function FillHome() {
|
||||||
|
@ -171,13 +171,7 @@ function FillHome() {
|
||||||
ApiCache.Urls[Profile.Url] = Profile;
|
ApiCache.Urls[Profile.Url] = Profile;
|
||||||
var Rnd = RndHtmlId();
|
var Rnd = RndHtmlId();
|
||||||
Window.querySelector('ul').innerHTML += `<li id="${Rnd}">
|
Window.querySelector('ul').innerHTML += `<li id="${Rnd}">
|
||||||
<a href="${Profile.Url}" onclick="DisplayProfile('${Profile.Url}'); return false;">
|
${Templating.ViewProfile(Profile, {Name: Profile.Url})}
|
||||||
<img class="Profile Banner" data-assign="src=Banner" src="${MkUrl(Profile.Banner)}"/>
|
|
||||||
<div>
|
|
||||||
<img class="Profile Icon" data-assign="src=Icon" src="${MkUrl(Profile.Icon)}"/>
|
|
||||||
<span data-assign="innerHTML=Name">${Profile.Url}</span>
|
|
||||||
</div>
|
|
||||||
</a>
|
|
||||||
</li>`;
|
</li>`;
|
||||||
var Endp = ApiEndpoints.ServerInfo[Profile.ServerSoftware];
|
var Endp = ApiEndpoints.ServerInfo[Profile.ServerSoftware];
|
||||||
var Method = Endp.Method || Endp;
|
var Method = Endp.Method || Endp;
|
||||||
|
|
|
@ -30,7 +30,7 @@ function NetCall(Data, Proc) {
|
||||||
// Req.open(Method, `${FriendicaUrl}/api/${Endpoint}.json`, true);
|
// Req.open(Method, `${FriendicaUrl}/api/${Endpoint}.json`, true);
|
||||||
// Req.setRequestHeader('Authorization', `Basic ${btoa(FriendicaCredentials)}`);
|
// Req.setRequestHeader('Authorization', `Basic ${btoa(FriendicaCredentials)}`);
|
||||||
//};
|
//};
|
||||||
Req.open(Method, MkUrl(`${Data.Target}/${Endpoint}`), true);
|
Req.open(Method, MkReqUrl(`${Data.Target}/${Endpoint}`), true);
|
||||||
Req.setRequestHeader('X-Requested-With', 'XMLHttpRequest');
|
Req.setRequestHeader('X-Requested-With', 'XMLHttpRequest');
|
||||||
_.forOwn(_.merge({"Content-Type": "application/json"}, Data.Headers), function(Val, Key) {
|
_.forOwn(_.merge({"Content-Type": "application/json"}, Data.Headers), function(Val, Key) {
|
||||||
Req.setRequestHeader(Key, Val);
|
Req.setRequestHeader(Key, Val);
|
||||||
|
@ -52,7 +52,7 @@ function IsHttpCodeGood(Code) {
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
function MkUrl(Url) {
|
function MkReqUrl(Url) {
|
||||||
if (Url && !Url.toLowerCase().startsWith(HttpProxy)) {
|
if (Url && !Url.toLowerCase().startsWith(HttpProxy)) {
|
||||||
Url = HttpProxy + Url;
|
Url = HttpProxy + Url;
|
||||||
};
|
};
|
||||||
|
|
|
@ -63,6 +63,10 @@ img, video {
|
||||||
margin: 12px;
|
margin: 12px;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.View.Profile {
|
||||||
|
display: inline-block;
|
||||||
|
}
|
||||||
|
|
||||||
.Profile.Banner {
|
.Profile.Banner {
|
||||||
width: 384px;
|
width: 384px;
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,24 +1,40 @@
|
||||||
var Templating = {
|
var Templating = {
|
||||||
ViewNote(Note) {
|
ViewNote(Note, Override) {
|
||||||
|
Override = Override || {};
|
||||||
|
//var Url = TryStr(Note.Url) || Note.ServerId;
|
||||||
|
var Url = Override.Url || GetWebUrl(Note, 'Note');
|
||||||
|
//var ProfileUrl = TryStr(Note.Profile.Url) || Note.Profile.ServerUsername;
|
||||||
|
var ProfileUrl = Override.ProfileUrl || GetWebUrl(Note.Profile, 'Profile');
|
||||||
|
//if (Note.Quoting) {
|
||||||
|
// //Note.Quoting.Profile.Url = TryStr(Note.Quoting.Profile.Url) || Note.Quoting.Profile.ServerUsername;
|
||||||
|
//};
|
||||||
return `<div class="View Note">
|
return `<div class="View Note">
|
||||||
<a href="${Note.Profile.Url}" onclick="DisplayProfile('${Note.Profile.Url}'); return false;">
|
<a href="${ProfileUrl}" onclick="DisplayProfile('${ProfileUrl}'); return false;">
|
||||||
<img class="Profile Icon" src="${MkUrl(Note.Profile.Icon)}"/>
|
<img class="Profile Icon" src="${MkReqUrl(Note.Profile.Icon)}"/>
|
||||||
${Note.Profile.Name}
|
${Note.Profile.Name}
|
||||||
</a>
|
</a>
|
||||||
<div class="Note Content">
|
<div class="Note Content">
|
||||||
${Note.Content ? Note.Content : 'renoted:'}
|
${Note.Content ? Note.Content : 'renoted:'}
|
||||||
${Note.Quoting ? Templating.ViewNote(Note.Quoting) : ''}
|
${Note.Quoting ? Templating.ViewNote(Note.Quoting) : ''}
|
||||||
</div>
|
</div>
|
||||||
<a href="${Note.Url}" onclick="DisplayThread('${Note.Url}'); return false;">${Note.Time}</a>
|
<a href="${Url}" onclick="DisplayThread('${Url}'); return false;">
|
||||||
|
${Note.Time}
|
||||||
|
</a>
|
||||||
</div>`;
|
</div>`;
|
||||||
},
|
},
|
||||||
ViewProfile(Profile) {
|
ViewProfile(Profile, Override) {
|
||||||
return `<div class="View Profile" style="display: inline-block;">
|
Override = Override || {};
|
||||||
<a href="${Profile.Url}">
|
//var Url = TryStr(Profile.Url) || Profile.ServerUsername;
|
||||||
<img class="Profile Banner" src="${MkUrl(Profile.Banner)}"/>
|
var Url = Override.Url || GetWebUrl(Profile, 'Profile');
|
||||||
|
var Name = Override.Name || Profile.Name;
|
||||||
|
return `<div class="View Profile">
|
||||||
|
<a href="${Url}" onclick="DisplayProfile('${Url}'); return false;">
|
||||||
|
<img class="Profile Banner" data-assign="src=Banner" src="${Override.Banner || MkReqUrl(Profile.Banner)}"/>
|
||||||
<div>
|
<div>
|
||||||
<img class="Profile Icon" src="${MkUrl(Profile.Icon)}"/>
|
<img class="Profile Icon" data-assign="src=Icon" src="${Override.Icon || MkReqUrl(Profile.Icon)}"/>
|
||||||
${Profile.Name}
|
<span data-assign="innerHTML=Name">
|
||||||
|
${Name}
|
||||||
|
</span>
|
||||||
</div>
|
</div>
|
||||||
</a>
|
</a>
|
||||||
</div>`;
|
</div>`;
|
||||||
|
|
20
App/Utils.js
20
App/Utils.js
|
@ -42,8 +42,16 @@ function LogDebug(Data, Status) {
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
function IsObj(Item) {
|
function TryStr(Val) {
|
||||||
return typeof(Item) === 'object';
|
if (typeof(Val) === 'string') {
|
||||||
|
return Val;
|
||||||
|
} else {
|
||||||
|
return false;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
function IsObj(Val) {
|
||||||
|
return typeof(Val) === 'object';
|
||||||
};
|
};
|
||||||
|
|
||||||
function ExtrimObj(Obj) {
|
function ExtrimObj(Obj) {
|
||||||
|
@ -74,6 +82,14 @@ function UnB64Obj(Obj) {
|
||||||
return JSON.parse(atob(Obj));
|
return JSON.parse(atob(Obj));
|
||||||
};
|
};
|
||||||
|
|
||||||
|
function JPath(Path) {
|
||||||
|
Path = Path.trim();
|
||||||
|
if (!(Path.startsWith('[') || Path.startsWith('.'))) {
|
||||||
|
Path = `.${Path}`;
|
||||||
|
};
|
||||||
|
return Path;
|
||||||
|
};
|
||||||
|
|
||||||
// https://stackoverflow.com/a/7616484
|
// https://stackoverflow.com/a/7616484
|
||||||
String.prototype.hashCode = function() {
|
String.prototype.hashCode = function() {
|
||||||
var hash = 0, i, chr;
|
var hash = 0, i, chr;
|
||||||
|
|
Loading…
Reference in New Issue