mirror of
https://github.com/snachodog/tok-to-insta-follower-bridge.git
synced 2025-04-10 14:11:22 -06:00
🚀 support for firefox
This commit is contained in:
parent
0e4c201394
commit
36f590f1a6
8
.github/workflows/publish.yml
vendored
8
.github/workflows/publish.yml
vendored
@ -1,4 +1,4 @@
|
||||
name: "Publish to Chrome Web Store"
|
||||
name: "Publish to Extension Store"
|
||||
on:
|
||||
push:
|
||||
branches:
|
||||
@ -64,12 +64,12 @@ jobs:
|
||||
run: npx changeset tag
|
||||
|
||||
- name: Build the extension
|
||||
run: npm run build
|
||||
run: npm run build && npm run build:firefox
|
||||
|
||||
- name: Package the extension into a zip artifact
|
||||
run: npm run package
|
||||
run: npm run package && npm run package:firefox
|
||||
|
||||
- name: Publish to Chrome Web Store
|
||||
- name: Publish to Extension Store
|
||||
uses: PlasmoHQ/bpp@v3
|
||||
with:
|
||||
keys: ${{ secrets.PUBLISH_KEYS }}
|
||||
|
@ -11,6 +11,7 @@ https://github.com/kawamataryo/sky-follower-bridge/assets/11070996/0c87f9b9-573f
|
||||
|
||||
## 📦 Installation
|
||||
- [Chrome Web Store](https://chrome.google.com/webstore/detail/sky-follower-bridge/behhbpbpmailcnfbjagknjngnfdojpko)
|
||||
- [Firefox Add-ons](https://addons.mozilla.org/ja/firefox/addon/sky-follower-bridge/)
|
||||
|
||||
## 🚀 How to use
|
||||
1. Open your Twitter [Follower](https://twitter.com/following) or [Follow](https://twitter.com/followers) or [list members](), [blocking](https://twitter.com/settings/blocked/all) page.
|
||||
|
13
src/background/messages/block.ts
Normal file
13
src/background/messages/block.ts
Normal file
@ -0,0 +1,13 @@
|
||||
import type { PlasmoMessaging } from "@plasmohq/messaging"
|
||||
import { BskyClient } from "~lib/bskyClient";
|
||||
|
||||
const handler: PlasmoMessaging.MessageHandler = async (req, res) => {
|
||||
const { session, subjectDid } = req.body
|
||||
const client = BskyClient.createAgentFromSession(session)
|
||||
|
||||
res.send({
|
||||
result: await client.block(subjectDid)
|
||||
})
|
||||
}
|
||||
|
||||
export default handler
|
13
src/background/messages/follow.ts
Normal file
13
src/background/messages/follow.ts
Normal file
@ -0,0 +1,13 @@
|
||||
import type { PlasmoMessaging } from "@plasmohq/messaging"
|
||||
import { BskyClient } from "~lib/bskyClient";
|
||||
|
||||
const handler: PlasmoMessaging.MessageHandler = async (req, res) => {
|
||||
const { session, subjectDid } = req.body
|
||||
const client = BskyClient.createAgentFromSession(session)
|
||||
|
||||
res.send({
|
||||
result: await client.follow(subjectDid)
|
||||
})
|
||||
}
|
||||
|
||||
export default handler
|
17
src/background/messages/login.ts
Normal file
17
src/background/messages/login.ts
Normal file
@ -0,0 +1,17 @@
|
||||
import type { PlasmoMessaging } from "@plasmohq/messaging"
|
||||
import { BskyClient } from "../../lib/bskyClient";
|
||||
|
||||
const handler: PlasmoMessaging.MessageHandler = async (req, res) => {
|
||||
const { identifier, password } = req.body
|
||||
|
||||
const agent = await BskyClient.createAgent({
|
||||
identifier,
|
||||
password,
|
||||
})
|
||||
|
||||
res.send({
|
||||
session: agent.session,
|
||||
})
|
||||
}
|
||||
|
||||
export default handler
|
16
src/background/messages/searchUser.ts
Normal file
16
src/background/messages/searchUser.ts
Normal file
@ -0,0 +1,16 @@
|
||||
import type { PlasmoMessaging } from "@plasmohq/messaging"
|
||||
import { BskyClient } from "~lib/bskyClient";
|
||||
|
||||
const handler: PlasmoMessaging.MessageHandler = async (req, res) => {
|
||||
const { session, term, limit } = req.body
|
||||
const client = BskyClient.createAgentFromSession(session)
|
||||
|
||||
res.send({
|
||||
actors: await client.searchUser({
|
||||
term,
|
||||
limit,
|
||||
})
|
||||
})
|
||||
}
|
||||
|
||||
export default handler
|
13
src/background/messages/unblock.ts
Normal file
13
src/background/messages/unblock.ts
Normal file
@ -0,0 +1,13 @@
|
||||
import type { PlasmoMessaging } from "@plasmohq/messaging"
|
||||
import { BskyClient } from "~lib/bskyClient";
|
||||
|
||||
const handler: PlasmoMessaging.MessageHandler = async (req, res) => {
|
||||
const { session, blockUri } = req.body
|
||||
const client = BskyClient.createAgentFromSession(session)
|
||||
|
||||
res.send({
|
||||
result: await client.unblock(blockUri)
|
||||
})
|
||||
}
|
||||
|
||||
export default handler
|
13
src/background/messages/unfollow.ts
Normal file
13
src/background/messages/unfollow.ts
Normal file
@ -0,0 +1,13 @@
|
||||
import type { PlasmoMessaging } from "@plasmohq/messaging"
|
||||
import { BskyClient } from "~lib/bskyClient";
|
||||
|
||||
const handler: PlasmoMessaging.MessageHandler = async (req, res) => {
|
||||
const { session, followUri } = req.body
|
||||
const client = BskyClient.createAgentFromSession(session)
|
||||
|
||||
res.send({
|
||||
result: await client.unfollow(followUri)
|
||||
})
|
||||
}
|
||||
|
||||
export default handler
|
@ -1,8 +1,9 @@
|
||||
import { BskyClient, type BskyLoginParams } from "./lib/bskyClient";
|
||||
import { type BskyLoginParams } from "./lib/bskyClient";
|
||||
import type { PlasmoCSConfig } from "plasmo"
|
||||
import { MESSAGE_NAMES, VIEWER_STATE } from "~lib/constants";
|
||||
import "./style.content.css"
|
||||
import { searchAndInsertBskyUsers } from '~lib/searchAndInsertBskyUsers';
|
||||
import { BskyServiceWorkerClient } from "~lib/bskyServiceWorkerClient";
|
||||
|
||||
export const config: PlasmoCSConfig = {
|
||||
matches: ["https://twitter.com/*", "https://x.com/*"],
|
||||
@ -15,10 +16,11 @@ const searchAndShowBskyUsers = async ({
|
||||
messageName,
|
||||
}: BskyLoginParams & { messageName: string }) => {
|
||||
|
||||
const agent = await BskyClient.createAgent({
|
||||
const agent = await BskyServiceWorkerClient.createAgent({
|
||||
identifier,
|
||||
password,
|
||||
})
|
||||
});
|
||||
|
||||
switch (messageName) {
|
||||
case MESSAGE_NAMES.SEARCH_BSKY_USER_ON_FOLLOW_PAGE:
|
||||
await searchAndInsertBskyUsers({
|
||||
|
@ -1,4 +1,4 @@
|
||||
import { AtUri, BskyAgent } from "@atproto/api";
|
||||
import { AtUri, BskyAgent, type AtpSessionData } from "@atproto/api";
|
||||
|
||||
export type BskyLoginParams = {
|
||||
identifier: string;
|
||||
@ -13,9 +13,24 @@ export class BskyClient {
|
||||
email: string;
|
||||
};
|
||||
agent: BskyAgent;
|
||||
session = {}
|
||||
|
||||
private constructor() {
|
||||
this.agent = new BskyAgent({ service: this.service });
|
||||
this.agent = new BskyAgent({ service: this.service, persistSession: (evt, session) => {
|
||||
this.session = session
|
||||
} });
|
||||
}
|
||||
|
||||
public static createAgentFromSession(session: AtpSessionData): BskyClient {
|
||||
const client = new BskyClient();
|
||||
client.agent.resumeSession(session);
|
||||
client.me = {
|
||||
did: session.did,
|
||||
handle: session.handle,
|
||||
email: session.email,
|
||||
}
|
||||
|
||||
return client;
|
||||
}
|
||||
|
||||
public static async createAgent({
|
||||
|
92
src/lib/bskyServiceWorkerClient.ts
Normal file
92
src/lib/bskyServiceWorkerClient.ts
Normal file
@ -0,0 +1,92 @@
|
||||
import { sendToBackground } from "@plasmohq/messaging";
|
||||
|
||||
export type BskyLoginParams = {
|
||||
identifier: string;
|
||||
password: string;
|
||||
}
|
||||
|
||||
export class BskyServiceWorkerClient {
|
||||
private session = {}
|
||||
|
||||
private constructor() {
|
||||
}
|
||||
|
||||
public static async createAgent({
|
||||
identifier,
|
||||
password,
|
||||
}: BskyLoginParams): Promise<BskyServiceWorkerClient> {
|
||||
const client = new BskyServiceWorkerClient();
|
||||
const { session } = await sendToBackground({
|
||||
name: "login",
|
||||
body: {
|
||||
identifier,
|
||||
password,
|
||||
}
|
||||
})
|
||||
client.session = session
|
||||
return client;
|
||||
}
|
||||
|
||||
public searchUser = async ({
|
||||
term,
|
||||
limit,
|
||||
}: {
|
||||
term: string;
|
||||
limit: number;
|
||||
}) => {
|
||||
const { actors } = await sendToBackground({
|
||||
name: "searchUser",
|
||||
body: {
|
||||
session: this.session,
|
||||
term,
|
||||
limit,
|
||||
}
|
||||
})
|
||||
return actors;
|
||||
};
|
||||
|
||||
public follow = async (subjectDid: string) => {
|
||||
const { result } = await sendToBackground({
|
||||
name: "follow",
|
||||
body: {
|
||||
session: this.session,
|
||||
subjectDid
|
||||
}
|
||||
})
|
||||
return result;
|
||||
}
|
||||
|
||||
public unfollow = async (followUri: string) => {
|
||||
const { result } = await sendToBackground({
|
||||
name: "unfollow",
|
||||
body: {
|
||||
session: this.session,
|
||||
followUri
|
||||
}
|
||||
})
|
||||
return result;
|
||||
}
|
||||
|
||||
public block = async (subjectDid: string) => {
|
||||
const { result } = await sendToBackground({
|
||||
name: "block",
|
||||
body: {
|
||||
session: this.session,
|
||||
subjectDid
|
||||
}
|
||||
})
|
||||
return result;
|
||||
}
|
||||
|
||||
public unblock = async (blockUri: string) => {
|
||||
// TODO: unblock is not working. Need to fix it.
|
||||
const { result } = await sendToBackground({
|
||||
name: "unblock",
|
||||
body: {
|
||||
session: this.session,
|
||||
blockUri
|
||||
}
|
||||
})
|
||||
return result;
|
||||
}
|
||||
}
|
@ -5,6 +5,7 @@ import { debugLog } from "~lib/utils";
|
||||
import type { BskyClient } from './bskyClient';
|
||||
import type { ViewerState } from '@atproto/api/dist/client/types/app/bsky/actor/defs';
|
||||
import type { UserCellBtnLabel } from './components/BskyUserCell';
|
||||
import type { BskyServiceWorkerClient } from './bskyServiceWorkerClient';
|
||||
|
||||
|
||||
const notFoundUserCache = new Set<string>()
|
||||
@ -20,7 +21,7 @@ export const searchAndInsertBskyUsers = async (
|
||||
addQuery,
|
||||
removeQuery,
|
||||
}: {
|
||||
agent: BskyClient,
|
||||
agent: BskyServiceWorkerClient | BskyClient,
|
||||
userCellQueryParam: string,
|
||||
btnLabel: UserCellBtnLabel,
|
||||
statusKey: keyof ViewerState,
|
||||
|
Loading…
x
Reference in New Issue
Block a user