UNPKG

2.74 kBJavaScriptView Raw
1const pull = require('pull-stream');
2
3module.exports = (sbot, myIdent, chessIndex) => {
4 // untested
5 function followPlayer(playerPubKey) {
6 sbot.publish({
7 type: 'contact',
8 contact: playerPubKey,
9 following: true,
10 });
11 }
12
13 // untested
14 function unfollowPlayer(playerPubKey) {
15 sbot.publish({
16 type: 'contact',
17 contact: playerPubKey,
18 following: false,
19 });
20 }
21
22 function consumeStreamIntoArrayPromise(source, through) {
23 return new Promise((resolve, reject) => {
24 pull(source, through, pull.collect((err, results) => {
25 if (err) {
26 reject(err);
27 } else {
28 resolve(results);
29 }
30 }));
31 });
32 }
33
34 function followedByMe() {
35 const followsMe = sbot.links({
36 source: myIdent,
37 rel: 'contact',
38 values: true,
39 reverse: true,
40 });
41
42 const onlyStillFollowingsThrough = pull(
43 pull.unique('dest'),
44 pull.filter(msg => msg.value.content.following !== false),
45 );
46
47 return consumeStreamIntoArrayPromise(followsMe, onlyStillFollowingsThrough)
48 .then(results => results.map(a => a.dest));
49 }
50
51 function followingMe() {
52 const followsMe = sbot.links({
53 dest: myIdent,
54 rel: 'contact',
55 values: true,
56 reverse: true,
57 });
58
59 const onlyStillFollowingsThrough = pull(
60 pull.unique('source'),
61 pull.filter(msg => msg.value.content.following !== false),
62 );
63
64 return consumeStreamIntoArrayPromise(followsMe, onlyStillFollowingsThrough)
65 .then(results => results.map(a => a.source));
66 }
67
68 function getPlayerDisplayName(playerPubKey) {
69 // TODO: have some way to mark a game as corrupted.
70 if (!playerPubKey || !playerPubKey.startsWith('@')) {
71 return Promise.resolve('<error>');
72 }
73
74 const aboutStream = sbot.links({
75 dest: playerPubKey,
76 rel: 'about',
77 reverse: true,
78 values: true,
79 source: playerPubKey,
80 });
81
82 return new Promise((resolve, reject) => {
83 pull(aboutStream, pull.find(msg => msg.value.content.name, (err, result) => {
84 if (err) {
85 reject(err);
86 } else {
87 result = (result && result.value.content.name) ? result.value.content.name : playerPubKey;
88 resolve(result);
89 }
90 }));
91 });
92 }
93
94 function getWeightedPlayFrequencyList() {
95
96 return new Promise( (resolve, reject) => {
97 chessIndex.weightedPlayFrequencyList(myIdent, (err, result) => {
98 if (err) {
99 reject(err);
100 } else {
101 resolve(result);
102 }
103 });
104
105 });
106 }
107
108 return {
109 followingMe,
110 followedByMe,
111 followPlayer,
112 unfollowPlayer,
113 getPlayerDisplayName,
114 getWeightedPlayFrequencyList
115 };
116};