Compare commits
12 Commits
ce451b2449
...
v0.0.28
Author | SHA1 | Date | |
---|---|---|---|
c74f90ef04 | |||
26cb7e5a17 | |||
2bad6672d8 | |||
71c4011526 | |||
5e81078f59 | |||
31b78e74df | |||
2ff689aab0 | |||
0a6f0ed3f7 | |||
bfec46673d | |||
3a16614c72 | |||
9c9efb845c | |||
6192f1b94d |
@ -17,8 +17,8 @@ MAKEFLAGS += --no-builtin-rules
|
|||||||
## ANDROID_SDK := Path to the Android SDK.
|
## ANDROID_SDK := Path to the Android SDK.
|
||||||
|
|
||||||
VERSION_CODE := 33
|
VERSION_CODE := 33
|
||||||
VERSION_CODE_IOS := 8
|
VERSION_CODE_IOS := 9
|
||||||
VERSION_NUMBER := 0.0.28-wip
|
VERSION_NUMBER := 0.0.28
|
||||||
VERSION_NAME := This program kills fascists.
|
VERSION_NAME := This program kills fascists.
|
||||||
|
|
||||||
IPHONEOS_VERSION_MIN=14.0
|
IPHONEOS_VERSION_MIN=14.0
|
||||||
@ -1419,7 +1419,7 @@ dist-ios: iosrelease-app
|
|||||||
mkdir -p out/Payload/tildefriends.app
|
mkdir -p out/Payload/tildefriends.app
|
||||||
cp -avR out/tildefriends-iosrelease.app/* out/Payload/tildefriends.app/
|
cp -avR out/tildefriends-iosrelease.app/* out/Payload/tildefriends.app/
|
||||||
cp src/ios/tildefriends.png out/Payload/tildefriends.app/
|
cp src/ios/tildefriends.png out/Payload/tildefriends.app/
|
||||||
cp src/ios/icons/Assets.car out/Payload/tildefriends.app/
|
xcrun -sdk iphoneos actool --compile out/Payload/tildefriends.app/ --platform iphoneos --minimum-deployment-target $(IPHONEOS_VERSION_MIN) --app-icon AppIcon src/ios/icons/Assets.xcassets src/ios/icons/*.png --output-partial-info-plist out/actool.plist
|
||||||
cp src/ios/distribution.mobileprovision out/Payload/tildefriends.app/embedded.mobileprovision
|
cp src/ios/distribution.mobileprovision out/Payload/tildefriends.app/embedded.mobileprovision
|
||||||
xcrun -sdk iphoneos codesign -f -s 'Apple Distribution' --entitlements src/ios/Entitlements.plist --generate-entitlement-der out/Payload/tildefriends.app
|
xcrun -sdk iphoneos codesign -f -s 'Apple Distribution' --entitlements src/ios/Entitlements.plist --generate-entitlement-der out/Payload/tildefriends.app
|
||||||
cd out; zip -r tildefriends.ipa Payload; cd ..
|
cd out; zip -r tildefriends.ipa Payload; cd ..
|
||||||
|
@ -1,7 +1,9 @@
|
|||||||
async function main() {
|
async function main() {
|
||||||
let host = core.url.match(/.*\/\/(.*?)\//)[1];
|
print(core.url);
|
||||||
|
let host = core.url.match(/.*?\/\/([^:/]*)/)[1];
|
||||||
|
let port = await ssb.port();
|
||||||
let id = (await ssb.getServerIdentity()).substring(1);
|
let id = (await ssb.getServerIdentity()).substring(1);
|
||||||
let room = `net:${host}:${ssb.port}~shs:${id}:SSB+Room+SK3TLYC2T86EHQCUHBUHASCASE18JBV24=`;
|
let room = `net:${host}:${port}~shs:${id}:SSB+Room+SK3TLYC2T86EHQCUHBUHASCASE18JBV24=`;
|
||||||
await app.setDocument(`
|
await app.setDocument(`
|
||||||
<body style="color: #fff">
|
<body style="color: #fff">
|
||||||
<h1>Server</h1>
|
<h1>Server</h1>
|
||||||
|
2
deps/codemirror/cm6.js
vendored
6
deps/codemirror_src/package-lock.json
generated
vendored
@ -115,9 +115,9 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/@codemirror/search": {
|
"node_modules/@codemirror/search": {
|
||||||
"version": "6.5.9",
|
"version": "6.5.10",
|
||||||
"resolved": "https://registry.npmjs.org/@codemirror/search/-/search-6.5.9.tgz",
|
"resolved": "https://registry.npmjs.org/@codemirror/search/-/search-6.5.10.tgz",
|
||||||
"integrity": "sha512-7DdQ9aaZMMxuWB1u6IIFWWuK9NocVZwvo4nG8QjJTS6oZGvteoLSiXw3EbVZVlO08Ri2ltO89JVInMpfcJxhtg==",
|
"integrity": "sha512-RMdPdmsrUf53pb2VwflKGHEe1XVM07hI7vV2ntgw1dmqhimpatSJKva4VA9h4TLUDOD4EIF02201oZurpnEFsg==",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@codemirror/state": "^6.0.0",
|
"@codemirror/state": "^6.0.0",
|
||||||
"@codemirror/view": "^6.0.0",
|
"@codemirror/view": "^6.0.0",
|
||||||
|
@ -4,7 +4,8 @@
|
|||||||
- run the tests
|
- run the tests
|
||||||
- format + prettier
|
- format + prettier
|
||||||
- update metadata/en-US/changelogs
|
- update metadata/en-US/changelogs
|
||||||
- git tag
|
- git tag v1.2.3
|
||||||
|
- git tag -f latest_release
|
||||||
- push
|
- push
|
||||||
- make a release on gitea
|
- make a release on gitea
|
||||||
- upload the artifacts
|
- upload the artifacts
|
||||||
|
@ -1,3 +1,5 @@
|
|||||||
|
* Allow specifying all global settings from the command-line (CLI usage changed).
|
||||||
|
* Replication improvements.
|
||||||
* An iOS build is on TestFlight.
|
* An iOS build is on TestFlight.
|
||||||
* macOS targets are debug and release like everywhere else.
|
* macOS targets are debug and release like everywhere else.
|
||||||
* Running from a subdirectory is fine.
|
* Running from a subdirectory is fine.
|
||||||
@ -5,10 +7,9 @@
|
|||||||
* Invite fixes.
|
* Invite fixes.
|
||||||
* Follow/block UI fixes.
|
* Follow/block UI fixes.
|
||||||
* Mobile automatically logs in.
|
* Mobile automatically logs in.
|
||||||
* Allow specifying all global settings from the command-line.
|
* Updates:
|
||||||
* UpdateS:
|
|
||||||
* CodeMirror
|
* CodeMirror
|
||||||
* OpenSSL 3.4.1
|
* OpenSSL 3.4.1
|
||||||
* libbacktrace
|
* libbacktrace
|
||||||
* sqlite 3.49.1
|
|
||||||
* speedscope 1.22.2
|
* speedscope 1.22.2
|
||||||
|
* sqlite 3.49.1
|
||||||
|
6
package-lock.json
generated
@ -11,9 +11,9 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/prettier": {
|
"node_modules/prettier": {
|
||||||
"version": "3.5.1",
|
"version": "3.5.2",
|
||||||
"resolved": "https://registry.npmjs.org/prettier/-/prettier-3.5.1.tgz",
|
"resolved": "https://registry.npmjs.org/prettier/-/prettier-3.5.2.tgz",
|
||||||
"integrity": "sha512-hPpFQvHwL3Qv5AdRvBFMhnKo4tYxp0ReXiPn2bxkiohEX6mBeBwEpBSQTkD458RaaDKQMYSp4hX4UtfUTA5wDw==",
|
"integrity": "sha512-lc6npv5PH7hVqozBR7lkBNOGXV9vMwROAPlumdBkX0wTbbzPu/U1hk5yL8p2pt4Xoc+2mkT8t/sow2YrV/M5qg==",
|
||||||
"bin": {
|
"bin": {
|
||||||
"prettier": "bin/prettier.cjs"
|
"prettier": "bin/prettier.cjs"
|
||||||
},
|
},
|
||||||
|
@ -2,7 +2,7 @@
|
|||||||
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
|
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
package="com.unprompted.tildefriends"
|
package="com.unprompted.tildefriends"
|
||||||
android:versionCode="33"
|
android:versionCode="33"
|
||||||
android:versionName="0.0.28-wip">
|
android:versionName="0.0.28">
|
||||||
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
|
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
|
||||||
<uses-permission android:name="android.permission.INTERNET"/>
|
<uses-permission android:name="android.permission.INTERNET"/>
|
||||||
<application
|
<application
|
||||||
|
@ -19,7 +19,7 @@
|
|||||||
<string>iPhoneOS</string>
|
<string>iPhoneOS</string>
|
||||||
</array>
|
</array>
|
||||||
<key>CFBundleVersion</key>
|
<key>CFBundleVersion</key>
|
||||||
<string>8</string>
|
<string>9</string>
|
||||||
<key>DTPlatformName</key>
|
<key>DTPlatformName</key>
|
||||||
<string>iphoneos</string>
|
<string>iphoneos</string>
|
||||||
<key>LSRequiresIPhoneOS</key>
|
<key>LSRequiresIPhoneOS</key>
|
||||||
|
BIN
src/ios/icons/Assets.xcassets/AppIcon.appiconset/100.png
Normal file
After Width: | Height: | Size: 8.2 KiB |
BIN
src/ios/icons/Assets.xcassets/AppIcon.appiconset/1024.png
Normal file
After Width: | Height: | Size: 74 KiB |
BIN
src/ios/icons/Assets.xcassets/AppIcon.appiconset/114.png
Normal file
After Width: | Height: | Size: 9.6 KiB |
BIN
src/ios/icons/Assets.xcassets/AppIcon.appiconset/120.png
Normal file
After Width: | Height: | Size: 10 KiB |
BIN
src/ios/icons/Assets.xcassets/AppIcon.appiconset/144.png
Normal file
After Width: | Height: | Size: 13 KiB |
BIN
src/ios/icons/Assets.xcassets/AppIcon.appiconset/152.png
Normal file
After Width: | Height: | Size: 14 KiB |
BIN
src/ios/icons/Assets.xcassets/AppIcon.appiconset/167.png
Normal file
After Width: | Height: | Size: 15 KiB |
BIN
src/ios/icons/Assets.xcassets/AppIcon.appiconset/180.png
Normal file
After Width: | Height: | Size: 17 KiB |
BIN
src/ios/icons/Assets.xcassets/AppIcon.appiconset/20.png
Normal file
After Width: | Height: | Size: 974 B |
BIN
src/ios/icons/Assets.xcassets/AppIcon.appiconset/29.png
Normal file
After Width: | Height: | Size: 1.6 KiB |
BIN
src/ios/icons/Assets.xcassets/AppIcon.appiconset/40.png
Normal file
After Width: | Height: | Size: 2.6 KiB |
BIN
src/ios/icons/Assets.xcassets/AppIcon.appiconset/50.png
Normal file
After Width: | Height: | Size: 3.4 KiB |
BIN
src/ios/icons/Assets.xcassets/AppIcon.appiconset/57.png
Normal file
After Width: | Height: | Size: 4.0 KiB |
BIN
src/ios/icons/Assets.xcassets/AppIcon.appiconset/58.png
Normal file
After Width: | Height: | Size: 4.1 KiB |
BIN
src/ios/icons/Assets.xcassets/AppIcon.appiconset/60.png
Normal file
After Width: | Height: | Size: 4.3 KiB |
BIN
src/ios/icons/Assets.xcassets/AppIcon.appiconset/72.png
Normal file
After Width: | Height: | Size: 5.3 KiB |
BIN
src/ios/icons/Assets.xcassets/AppIcon.appiconset/76.png
Normal file
After Width: | Height: | Size: 5.6 KiB |
BIN
src/ios/icons/Assets.xcassets/AppIcon.appiconset/80.png
Normal file
After Width: | Height: | Size: 6.1 KiB |
BIN
src/ios/icons/Assets.xcassets/AppIcon.appiconset/87.png
Normal file
After Width: | Height: | Size: 6.9 KiB |
@ -1 +1 @@
|
|||||||
{"images":[{"idiom":"ios-marketing","scale":"1x","size":"1024x1024","filename":"icon-ios-marketing-1-1024-1024.png"}],"info":{"author":"xcode","version":1}}
|
{"images":[{"size":"60x60","expected-size":"180","filename":"180.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"iphone","scale":"3x"},{"size":"40x40","expected-size":"80","filename":"80.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"iphone","scale":"2x"},{"size":"40x40","expected-size":"120","filename":"120.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"iphone","scale":"3x"},{"size":"60x60","expected-size":"120","filename":"120.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"iphone","scale":"2x"},{"size":"57x57","expected-size":"57","filename":"57.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"iphone","scale":"1x"},{"size":"29x29","expected-size":"58","filename":"58.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"iphone","scale":"2x"},{"size":"29x29","expected-size":"29","filename":"29.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"iphone","scale":"1x"},{"size":"29x29","expected-size":"87","filename":"87.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"iphone","scale":"3x"},{"size":"57x57","expected-size":"114","filename":"114.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"iphone","scale":"2x"},{"size":"20x20","expected-size":"40","filename":"40.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"iphone","scale":"2x"},{"size":"20x20","expected-size":"60","filename":"60.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"iphone","scale":"3x"},{"size":"1024x1024","filename":"1024.png","expected-size":"1024","idiom":"ios-marketing","folder":"Assets.xcassets/AppIcon.appiconset/","scale":"1x"},{"size":"40x40","expected-size":"80","filename":"80.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"ipad","scale":"2x"},{"size":"72x72","expected-size":"72","filename":"72.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"ipad","scale":"1x"},{"size":"76x76","expected-size":"152","filename":"152.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"ipad","scale":"2x"},{"size":"50x50","expected-size":"100","filename":"100.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"ipad","scale":"2x"},{"size":"29x29","expected-size":"58","filename":"58.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"ipad","scale":"2x"},{"size":"76x76","expected-size":"76","filename":"76.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"ipad","scale":"1x"},{"size":"29x29","expected-size":"29","filename":"29.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"ipad","scale":"1x"},{"size":"50x50","expected-size":"50","filename":"50.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"ipad","scale":"1x"},{"size":"72x72","expected-size":"144","filename":"144.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"ipad","scale":"2x"},{"size":"40x40","expected-size":"40","filename":"40.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"ipad","scale":"1x"},{"size":"83.5x83.5","expected-size":"167","filename":"167.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"ipad","scale":"2x"},{"size":"20x20","expected-size":"20","filename":"20.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"ipad","scale":"1x"},{"size":"20x20","expected-size":"40","filename":"40.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"ipad","scale":"2x"}]}
|
Before Width: | Height: | Size: 101 KiB |
@ -1 +0,0 @@
|
|||||||
{"info": {"version": 1, "author": "xcode"}}
|
|
Before Width: | Height: | Size: 4.2 KiB |
Before Width: | Height: | Size: 1.8 KiB |
Before Width: | Height: | Size: 2.6 KiB |
Before Width: | Height: | Size: 5.9 KiB |
Before Width: | Height: | Size: 9.6 KiB |
Before Width: | Height: | Size: 13 KiB |
BIN
src/ios/icons/appstore.png
Normal file
After Width: | Height: | Size: 74 KiB |
Before Width: | Height: | Size: 6.2 KiB |
Before Width: | Height: | Size: 7.2 KiB |
Before Width: | Height: | Size: 8.3 KiB |
Before Width: | Height: | Size: 639 B |
Before Width: | Height: | Size: 12 KiB |
Before Width: | Height: | Size: 12 KiB |
Before Width: | Height: | Size: 14 KiB |
Before Width: | Height: | Size: 15 KiB |
Before Width: | Height: | Size: 17 KiB |
Before Width: | Height: | Size: 1.5 KiB |
Before Width: | Height: | Size: 2.6 KiB |
Before Width: | Height: | Size: 2.7 KiB |
Before Width: | Height: | Size: 38 KiB |
Before Width: | Height: | Size: 3.1 KiB |
Before Width: | Height: | Size: 3.7 KiB |
Before Width: | Height: | Size: 5.3 KiB |
Before Width: | Height: | Size: 7.6 KiB |
Before Width: | Height: | Size: 9.6 KiB |
Before Width: | Height: | Size: 10 KiB |
Before Width: | Height: | Size: 11 KiB |
Before Width: | Height: | Size: 4.2 KiB |
Before Width: | Height: | Size: 4.5 KiB |
Before Width: | Height: | Size: 858 B |
Before Width: | Height: | Size: 2.1 KiB |
Before Width: | Height: | Size: 3.4 KiB |
Before Width: | Height: | Size: 7.6 KiB |
Before Width: | Height: | Size: 2.1 KiB |
Before Width: | Height: | Size: 4.8 KiB |
Before Width: | Height: | Size: 1.4 KiB |
Before Width: | Height: | Size: 3.2 KiB |
Before Width: | Height: | Size: 5.2 KiB |
Before Width: | Height: | Size: 101 KiB |
Before Width: | Height: | Size: 3.2 KiB |
Before Width: | Height: | Size: 7.2 KiB |
BIN
src/ios/icons/playstore.png
Normal file
After Width: | Height: | Size: 56 KiB |
Before Width: | Height: | Size: 104 KiB |
@ -1299,10 +1299,12 @@ static int _tf_run_task(const tf_run_args_t* args, int index)
|
|||||||
sqlite3* db = tf_ssb_acquire_db_reader(ssb);
|
sqlite3* db = tf_ssb_acquire_db_reader(ssb);
|
||||||
int64_t http_port = 0;
|
int64_t http_port = 0;
|
||||||
int64_t https_port = 0;
|
int64_t https_port = 0;
|
||||||
|
char out_http_port_file[512] = "";
|
||||||
tf_ssb_db_get_global_setting_int64(db, "http_port", &http_port);
|
tf_ssb_db_get_global_setting_int64(db, "http_port", &http_port);
|
||||||
tf_ssb_db_get_global_setting_int64(db, "https_port", &https_port);
|
tf_ssb_db_get_global_setting_int64(db, "https_port", &https_port);
|
||||||
|
tf_ssb_db_get_global_setting_string(db, "out_http_port_file", out_http_port_file, sizeof(out_http_port_file));
|
||||||
tf_ssb_release_db_reader(ssb, db);
|
tf_ssb_release_db_reader(ssb, db);
|
||||||
if (http_port || https_port)
|
if (http_port || https_port || *out_http_port_file)
|
||||||
{
|
{
|
||||||
if (args->zip)
|
if (args->zip)
|
||||||
{
|
{
|
||||||
|
10
src/ssb.c
@ -746,7 +746,9 @@ static bool _tf_ssb_connection_get_request_callback(
|
|||||||
*out_name = request->name;
|
*out_name = request->name;
|
||||||
}
|
}
|
||||||
request->last_active = uv_now(connection->ssb->loop);
|
request->last_active = uv_now(connection->ssb->loop);
|
||||||
if (connection->flags & k_tf_ssb_connect_flag_one_shot)
|
if (tf_ssb_connection_is_connected(connection) && !tf_ssb_connection_is_closing(connection) && !tf_ssb_is_shutting_down(tf_ssb_connection_get_ssb(connection)))
|
||||||
|
{
|
||||||
|
if ((connection->flags & k_tf_ssb_connect_flag_one_shot))
|
||||||
{
|
{
|
||||||
uv_timer_start(&connection->activity_timer, _tf_ssb_connection_activity_timer, k_activity_timeout_ms, 0);
|
uv_timer_start(&connection->activity_timer, _tf_ssb_connection_activity_timer, k_activity_timeout_ms, 0);
|
||||||
}
|
}
|
||||||
@ -754,6 +756,7 @@ static bool _tf_ssb_connection_get_request_callback(
|
|||||||
{
|
{
|
||||||
uv_timer_start(&connection->ssb->request_activity_timer, _tf_ssb_request_activity_timer, k_rpc_active_ms, 0);
|
uv_timer_start(&connection->ssb->request_activity_timer, _tf_ssb_request_activity_timer, k_rpc_active_ms, 0);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
@ -799,6 +802,8 @@ void tf_ssb_connection_add_request(tf_ssb_connection_t* connection, int32_t requ
|
|||||||
connection->requests_count++;
|
connection->requests_count++;
|
||||||
connection->ssb->request_count++;
|
connection->ssb->request_count++;
|
||||||
}
|
}
|
||||||
|
if (tf_ssb_connection_is_connected(connection) && !tf_ssb_connection_is_closing(connection) && !tf_ssb_is_shutting_down(tf_ssb_connection_get_ssb(connection)))
|
||||||
|
{
|
||||||
if (connection->flags & k_tf_ssb_connect_flag_one_shot)
|
if (connection->flags & k_tf_ssb_connect_flag_one_shot)
|
||||||
{
|
{
|
||||||
uv_timer_start(&connection->activity_timer, _tf_ssb_connection_activity_timer, k_activity_timeout_ms, 0);
|
uv_timer_start(&connection->activity_timer, _tf_ssb_connection_activity_timer, k_activity_timeout_ms, 0);
|
||||||
@ -807,6 +812,7 @@ void tf_ssb_connection_add_request(tf_ssb_connection_t* connection, int32_t requ
|
|||||||
{
|
{
|
||||||
uv_timer_start(&connection->ssb->request_activity_timer, _tf_ssb_request_activity_timer, k_rpc_active_ms, 0);
|
uv_timer_start(&connection->ssb->request_activity_timer, _tf_ssb_request_activity_timer, k_rpc_active_ms, 0);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
_tf_ssb_notify_connections_changed(connection->ssb, k_tf_ssb_change_update, connection);
|
_tf_ssb_notify_connections_changed(connection->ssb, k_tf_ssb_change_update, connection);
|
||||||
connection->last_notified_active = now_ms;
|
connection->last_notified_active = now_ms;
|
||||||
}
|
}
|
||||||
@ -1997,7 +2003,7 @@ static void _tf_ssb_connection_destroy(tf_ssb_connection_t* connection, const ch
|
|||||||
if (!connection->is_closing)
|
if (!connection->is_closing)
|
||||||
{
|
{
|
||||||
connection->is_closing = true;
|
connection->is_closing = true;
|
||||||
uv_timer_start(&connection->linger_timer, _tf_ssb_connection_linger_timer, 5000, 0);
|
uv_timer_start(&connection->linger_timer, _tf_ssb_connection_linger_timer, ssb->shutting_down ? 0 : 5000, 0);
|
||||||
_tf_ssb_notify_connections_changed(ssb, k_tf_ssb_change_update, connection);
|
_tf_ssb_notify_connections_changed(ssb, k_tf_ssb_change_update, connection);
|
||||||
}
|
}
|
||||||
if (connection->connect_callback)
|
if (connection->connect_callback)
|
||||||
|
15
src/ssb.db.c
@ -1277,7 +1277,7 @@ static int _following_compare(const void* a, const void* b)
|
|||||||
|
|
||||||
static bool _has_following_entry(const char* id, following_t** list, int count)
|
static bool _has_following_entry(const char* id, following_t** list, int count)
|
||||||
{
|
{
|
||||||
return count ? bsearch(id, list, count, sizeof(following_t*), _following_compare) != 0 : false;
|
return count ? bsearch(id, list, count, sizeof(following_t*), _following_compare) != NULL : false;
|
||||||
}
|
}
|
||||||
|
|
||||||
static bool _add_following_entry(following_t*** list, int* count, following_t* add)
|
static bool _add_following_entry(following_t*** list, int* count, following_t* add)
|
||||||
@ -1432,24 +1432,25 @@ static void _populate_follows_and_blocks(tf_ssb_t* ssb, following_t* entry, foll
|
|||||||
static void _get_following(
|
static void _get_following(
|
||||||
tf_ssb_t* ssb, following_t* entry, following_t*** following, int* following_count, int depth, int max_depth, block_node_t* active_blocks, bool include_blocks)
|
tf_ssb_t* ssb, following_t* entry, following_t*** following, int* following_count, int depth, int max_depth, block_node_t* active_blocks, bool include_blocks)
|
||||||
{
|
{
|
||||||
|
int old_depth = entry->depth;
|
||||||
entry->depth = tf_min(depth, entry->depth);
|
entry->depth = tf_min(depth, entry->depth);
|
||||||
if (depth < max_depth && !entry->populated && !_is_blocked_by_active_blocks(entry->id, active_blocks))
|
if (depth < max_depth && depth < old_depth)
|
||||||
|
{
|
||||||
|
if (!_is_blocked_by_active_blocks(entry->id, active_blocks))
|
||||||
|
{
|
||||||
|
if (!entry->populated)
|
||||||
{
|
{
|
||||||
entry->populated = true;
|
entry->populated = true;
|
||||||
_populate_follows_and_blocks(ssb, entry, following, following_count, active_blocks, include_blocks);
|
_populate_follows_and_blocks(ssb, entry, following, following_count, active_blocks, include_blocks);
|
||||||
|
}
|
||||||
|
|
||||||
if (depth < max_depth)
|
|
||||||
{
|
|
||||||
block_node_t blocks = { .entry = entry, .parent = active_blocks };
|
block_node_t blocks = { .entry = entry, .parent = active_blocks };
|
||||||
for (int i = 0; i < entry->following_count; i++)
|
for (int i = 0; i < entry->following_count; i++)
|
||||||
{
|
|
||||||
if (!_has_following_entry(entry->following[i]->id, entry->blocking, entry->blocking_count))
|
|
||||||
{
|
{
|
||||||
_get_following(ssb, entry->following[i], following, following_count, depth + 1, max_depth, &blocks, include_blocks);
|
_get_following(ssb, entry->following[i], following, following_count, depth + 1, max_depth, &blocks, include_blocks);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
tf_ssb_following_t* tf_ssb_db_following_deep(tf_ssb_t* ssb, const char** ids, int count, int depth, bool include_blocks)
|
tf_ssb_following_t* tf_ssb_db_following_deep(tf_ssb_t* ssb, const char** ids, int count, int depth, bool include_blocks)
|
||||||
|
@ -83,6 +83,19 @@ static void _tf_ssb_rpc_blobs_get_after_work(tf_ssb_connection_t* connection, in
|
|||||||
tf_free(work);
|
tf_free(work);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void _tf_ssb_blobs_get_callback(tf_ssb_connection_t* connection, bool skip, void* user_data)
|
||||||
|
{
|
||||||
|
blobs_get_work_t* work = user_data;
|
||||||
|
if (!skip)
|
||||||
|
{
|
||||||
|
tf_ssb_connection_run_work(connection, _tf_ssb_rpc_blobs_get_work, _tf_ssb_rpc_blobs_get_after_work, work);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
_tf_ssb_rpc_blobs_get_after_work(connection, -1, work);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
static void _tf_ssb_rpc_blobs_get(tf_ssb_connection_t* connection, uint8_t flags, int32_t request_number, JSValue args, const uint8_t* message, size_t size, void* user_data)
|
static void _tf_ssb_rpc_blobs_get(tf_ssb_connection_t* connection, uint8_t flags, int32_t request_number, JSValue args, const uint8_t* message, size_t size, void* user_data)
|
||||||
{
|
{
|
||||||
if (flags & k_ssb_rpc_flag_end_error)
|
if (flags & k_ssb_rpc_flag_end_error)
|
||||||
@ -122,7 +135,7 @@ static void _tf_ssb_rpc_blobs_get(tf_ssb_connection_t* connection, uint8_t flags
|
|||||||
.request_number = request_number,
|
.request_number = request_number,
|
||||||
};
|
};
|
||||||
snprintf(work->id, sizeof(work->id), "%s", id);
|
snprintf(work->id, sizeof(work->id), "%s", id);
|
||||||
tf_ssb_connection_run_work(connection, _tf_ssb_rpc_blobs_get_work, _tf_ssb_rpc_blobs_get_after_work, work);
|
tf_ssb_connection_schedule_idle(connection, id, _tf_ssb_blobs_get_callback, work);
|
||||||
|
|
||||||
JS_FreeCString(context, id);
|
JS_FreeCString(context, id);
|
||||||
JS_FreeValue(context, arg);
|
JS_FreeValue(context, arg);
|
||||||
@ -1101,6 +1114,23 @@ static void _tf_ssb_rpc_ebt_replicate_resend_clock(tf_ssb_connection_t* connecti
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void _tf_ssb_rpc_ebt_schedule_send_clock(tf_ssb_connection_t* connection)
|
||||||
|
{
|
||||||
|
tf_ssb_ebt_t* ebt = tf_ssb_connection_get_ebt(connection);
|
||||||
|
int pending = tf_ssb_ebt_get_send_clock_pending(ebt) + 1;
|
||||||
|
tf_ssb_ebt_set_send_clock_pending(ebt, pending);
|
||||||
|
if (pending == 1)
|
||||||
|
{
|
||||||
|
resend_clock_t* resend = tf_malloc(sizeof(resend_clock_t));
|
||||||
|
*resend = (resend_clock_t) {
|
||||||
|
.connection = connection,
|
||||||
|
.request_number = -tf_ssb_connection_get_ebt_request_number(connection),
|
||||||
|
.pending = pending,
|
||||||
|
};
|
||||||
|
tf_ssb_connection_schedule_idle(connection, "ebt.clock", _tf_ssb_rpc_ebt_replicate_resend_clock, resend);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
static void _tf_ssb_rpc_ebt_replicate(tf_ssb_connection_t* connection, uint8_t flags, int32_t request_number, JSValue args, const uint8_t* message, size_t size, void* user_data)
|
static void _tf_ssb_rpc_ebt_replicate(tf_ssb_connection_t* connection, uint8_t flags, int32_t request_number, JSValue args, const uint8_t* message, size_t size, void* user_data)
|
||||||
{
|
{
|
||||||
tf_ssb_t* ssb = tf_ssb_connection_get_ssb(connection);
|
tf_ssb_t* ssb = tf_ssb_connection_get_ssb(connection);
|
||||||
@ -1140,18 +1170,7 @@ static void _tf_ssb_rpc_ebt_replicate(tf_ssb_connection_t* connection, uint8_t f
|
|||||||
|
|
||||||
if (resend_clock && tf_ssb_connection_is_connected(connection) && !tf_ssb_is_shutting_down(tf_ssb_connection_get_ssb(connection)) && !tf_ssb_connection_is_closing(connection))
|
if (resend_clock && tf_ssb_connection_is_connected(connection) && !tf_ssb_is_shutting_down(tf_ssb_connection_get_ssb(connection)) && !tf_ssb_connection_is_closing(connection))
|
||||||
{
|
{
|
||||||
int pending = tf_ssb_ebt_get_send_clock_pending(ebt) + 1;
|
_tf_ssb_rpc_ebt_schedule_send_clock(connection);
|
||||||
tf_ssb_ebt_set_send_clock_pending(ebt, pending);
|
|
||||||
if (pending == 1)
|
|
||||||
{
|
|
||||||
resend_clock_t* resend = tf_malloc(sizeof(resend_clock_t));
|
|
||||||
*resend = (resend_clock_t) {
|
|
||||||
.connection = connection,
|
|
||||||
.request_number = request_number,
|
|
||||||
.pending = pending,
|
|
||||||
};
|
|
||||||
tf_ssb_connection_schedule_idle(connection, "ebt.clock", _tf_ssb_rpc_ebt_replicate_resend_clock, resend);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
JS_FreeValue(context, name);
|
JS_FreeValue(context, name);
|
||||||
JS_FreeValue(context, author);
|
JS_FreeValue(context, author);
|
||||||
@ -1855,10 +1874,25 @@ static void _tf_ssb_rpc_invite_use(tf_ssb_connection_t* connection, uint8_t flag
|
|||||||
tf_ssb_connection_run_work(connection, _tf_ssb_rpc_invite_use_work, _tf_ssb_rpc_invite_use_after_work, work);
|
tf_ssb_connection_run_work(connection, _tf_ssb_rpc_invite_use_work, _tf_ssb_rpc_invite_use_after_work, work);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void _tf_ssb_rpc_message_added_callback(tf_ssb_t* ssb, const char* id, void* user_data)
|
||||||
|
{
|
||||||
|
tf_ssb_connection_t* connections[256];
|
||||||
|
int count = tf_ssb_get_connections(ssb, connections, tf_countof(connections));
|
||||||
|
for (int i = 0; i < count; i++)
|
||||||
|
{
|
||||||
|
tf_ssb_connection_t* connection = connections[i];
|
||||||
|
if (tf_ssb_connection_is_connected(connection) && !tf_ssb_is_shutting_down(tf_ssb_connection_get_ssb(connection)) && !tf_ssb_connection_is_closing(connection))
|
||||||
|
{
|
||||||
|
_tf_ssb_rpc_ebt_schedule_send_clock(connections[i]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void tf_ssb_rpc_register(tf_ssb_t* ssb)
|
void tf_ssb_rpc_register(tf_ssb_t* ssb)
|
||||||
{
|
{
|
||||||
tf_ssb_add_connections_changed_callback(ssb, _tf_ssb_rpc_connections_changed_callback, NULL, NULL);
|
tf_ssb_add_connections_changed_callback(ssb, _tf_ssb_rpc_connections_changed_callback, NULL, NULL);
|
||||||
tf_ssb_add_broadcasts_changed_callback(ssb, _tf_ssb_rpc_broadcasts_changed_callback, NULL, NULL);
|
tf_ssb_add_broadcasts_changed_callback(ssb, _tf_ssb_rpc_broadcasts_changed_callback, NULL, NULL);
|
||||||
|
tf_ssb_add_message_added_callback(ssb, _tf_ssb_rpc_message_added_callback, NULL, NULL);
|
||||||
tf_ssb_add_rpc_callback(ssb, "gossip.ping", _tf_ssb_rpc_gossip_ping, NULL, NULL); /* DUPLEX */
|
tf_ssb_add_rpc_callback(ssb, "gossip.ping", _tf_ssb_rpc_gossip_ping, NULL, NULL); /* DUPLEX */
|
||||||
tf_ssb_add_rpc_callback(ssb, "blobs.get", _tf_ssb_rpc_blobs_get, NULL, NULL); /* SOURCE */
|
tf_ssb_add_rpc_callback(ssb, "blobs.get", _tf_ssb_rpc_blobs_get, NULL, NULL); /* SOURCE */
|
||||||
tf_ssb_add_rpc_callback(ssb, "blobs.has", _tf_ssb_rpc_blobs_has, NULL, NULL); /* ASYNC */
|
tf_ssb_add_rpc_callback(ssb, "blobs.has", _tf_ssb_rpc_blobs_has, NULL, NULL); /* ASYNC */
|
||||||
|
@ -1,2 +1,2 @@
|
|||||||
#define VERSION_NUMBER "0.0.28-wip"
|
#define VERSION_NUMBER "0.0.28"
|
||||||
#define VERSION_NAME "This program kills fascists."
|
#define VERSION_NAME "This program kills fascists."
|
||||||
|
@ -25,6 +25,7 @@ def fix_title(entry):
|
|||||||
return entry.title.split('\n')[0]
|
return entry.title.split('\n')[0]
|
||||||
|
|
||||||
def get_entries():
|
def get_entries():
|
||||||
|
seen = set()
|
||||||
results = []
|
results = []
|
||||||
for name, url in k_feeds.items():
|
for name, url in k_feeds.items():
|
||||||
feed = feedparser.parse(url)
|
feed = feedparser.parse(url)
|
||||||
@ -41,8 +42,12 @@ def get_entries():
|
|||||||
continue
|
continue
|
||||||
if entry.summary.startswith('<a href='):
|
if entry.summary.startswith('<a href='):
|
||||||
for m in re.findall(r'<a href="(.*?)">.*?</a>$\s*^([^\n]+)$', entry.summary, re.S | re.M):
|
for m in re.findall(r'<a href="(.*?)">.*?</a>$\s*^([^\n]+)$', entry.summary, re.S | re.M):
|
||||||
|
if not m[0] in seen:
|
||||||
|
seen.add(m[0])
|
||||||
results.append((time.mktime(entry.get('updated_parsed')), name, m[0], m[1]))
|
results.append((time.mktime(entry.get('updated_parsed')), name, m[0], m[1]))
|
||||||
else:
|
else:
|
||||||
|
if not entry.link in seen:
|
||||||
|
seen.add(entry.link)
|
||||||
results.append((time.mktime(entry.get('updated_parsed')), name, entry.link, entry.title.split('\n')[0]))
|
results.append((time.mktime(entry.get('updated_parsed')), name, entry.link, entry.title.split('\n')[0]))
|
||||||
results.sort()
|
results.sort()
|
||||||
results.reverse()
|
results.reverse()
|
||||||
|