Movatterモバイル変換


[0]ホーム

URL:


Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit8305dd5

Browse files
committed
Log direct messages and keep track of open direct message tabs
1 parente97bb51 commit8305dd5

File tree

17 files changed

+653
-302
lines changed

17 files changed

+653
-302
lines changed

‎assets/bindata.go‎

Lines changed: 40 additions & 40 deletions
Some generated files are not rendered by default. Learn more aboutcustomizing how changed files appear on GitHub.

‎client/js/modules/initialState.js‎

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,13 @@ function loadState({ store }, env) {
2929
});
3030
}
3131

32+
if(env.openDMs){
33+
store.dispatch({
34+
type:'PRIVATE_CHATS',
35+
privateChats:env.openDMs
36+
});
37+
}
38+
3239
if(env.users){
3340
store.dispatch({
3441
type:socketActions.USERS,

‎client/js/modules/storage.js‎

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
importCookiefrom'js-cookie';
22
importdebouncefrom'lodash/debounce';
33
import{getSelectedTab}from'state/tab';
4-
import{isChannel,stringifyTab}from'utils';
4+
import{stringifyTab}from'utils';
55
import{observe}from'utils/observe';
66

77
constsaveTab=debounce(
@@ -11,7 +11,7 @@ const saveTab = debounce(
1111

1212
exportdefaultfunctionstorage({ store}){
1313
observe(store,getSelectedTab,tab=>{
14-
if(isChannel(tab)||(tab.server&&!tab.name)){
14+
if(tab.server){
1515
saveTab(tab);
1616
}
1717
});

‎client/js/state/actions.js‎

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ export const CLOSE_MODAL = 'CLOSE_MODAL';
2626

2727
exportconstCLOSE_PRIVATE_CHAT='CLOSE_PRIVATE_CHAT';
2828
exportconstOPEN_PRIVATE_CHAT='OPEN_PRIVATE_CHAT';
29+
exportconstPRIVATE_CHATS='PRIVATE_CHATS';
2930

3031
exportconstSEARCH_MESSAGES='SEARCH_MESSAGES';
3132
exportconstTOGGLE_SEARCH='TOGGLE_SEARCH';

‎client/js/state/privateChats.js‎

Lines changed: 20 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,16 @@ export default createReducer(
3030
}
3131
},
3232

33+
[actions.PRIVATE_CHATS](state,{ privateChats}){
34+
privateChats.forEach(({ server, name})=>{
35+
if(!state[server]){
36+
state[server]=[];
37+
}
38+
39+
state[server].push(name);
40+
});
41+
},
42+
3343
[actions.socket.PM](state,action){
3444
if(action.from.indexOf('.')===-1){
3545
open(state,action.server,action.from);
@@ -46,7 +56,11 @@ export function openPrivateChat(server, nick) {
4656
return{
4757
type:actions.OPEN_PRIVATE_CHAT,
4858
server,
49-
nick
59+
nick,
60+
socket:{
61+
type:'open_dm',
62+
data:{ server,name:nick}
63+
}
5064
};
5165
}
5266

@@ -55,7 +69,11 @@ export function closePrivateChat(server, nick) {
5569
dispatch({
5670
type:actions.CLOSE_PRIVATE_CHAT,
5771
server,
58-
nick
72+
nick,
73+
socket:{
74+
type:'close_dm',
75+
data:{ server,name:nick}
76+
}
5977
});
6078
dispatch(updateSelection());
6179
};

‎server/index_data.go‎

Lines changed: 67 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@ type indexData struct {
3131
Defaults*config.Defaults
3232
Servers []Server
3333
Channels []*storage.Channel
34+
OpenDMs []storage.Tab
3435
HexIPbool
3536
VersiondispatchVersion
3637

@@ -43,7 +44,7 @@ type indexData struct {
4344
Messages*Messages
4445
}
4546

46-
func (d*Dispatch)getIndexData(r*http.Request,pathstring,state*State)*indexData {
47+
func (d*Dispatch)getIndexData(r*http.Request,state*State)*indexData {
4748
cfg:=d.Config()
4849

4950
data:=indexData{
@@ -98,35 +99,37 @@ func (d *Dispatch) getIndexData(r *http.Request, path string, state *State) *ind
9899
}
99100
data.Channels=channels
100101

101-
server,channel:=getTabFromPath(path)
102-
ifisInChannel(channels,server,channel) {
103-
data.addUsersAndMessages(server,channel,state)
104-
return&data
102+
openDMs,err:=state.user.GetOpenDMs()
103+
iferr!=nil {
104+
returnnil
105105
}
106+
data.OpenDMs=openDMs
106107

107-
server,channel=parseTabCookie(r,path)
108-
ifisInChannel(channels,server,channel) {
109-
data.addUsersAndMessages(server,channel,state)
108+
tab,err:=tabFromRequest(r)
109+
iferr==nil&&hasTab(channels,openDMs,tab.Server,tab.Name) {
110+
data.addUsersAndMessages(tab.Server,tab.Name,state)
110111
}
111112

112113
return&data
113114
}
114115

115-
func (d*indexData)addUsersAndMessages(server,channelstring,state*State) {
116-
users:=channelStore.GetUsers(server,channel)
117-
iflen(users)>0 {
118-
d.Users=&Userlist{
119-
Server:server,
120-
Channel:channel,
121-
Users:users,
116+
func (d*indexData)addUsersAndMessages(server,namestring,state*State) {
117+
ifisChannel(name) {
118+
users:=channelStore.GetUsers(server,name)
119+
iflen(users)>0 {
120+
d.Users=&Userlist{
121+
Server:server,
122+
Channel:name,
123+
Users:users,
124+
}
122125
}
123126
}
124127

125-
messages,hasMore,err:=state.user.GetLastMessages(server,channel,50)
128+
messages,hasMore,err:=state.user.GetLastMessages(server,name,50)
126129
iferr==nil&&len(messages)>0 {
127130
m:=Messages{
128131
Server:server,
129-
To:channel,
132+
To:name,
130133
Messages:messages,
131134
}
132135

@@ -138,41 +141,69 @@ func (d *indexData) addUsersAndMessages(server, channel string, state *State) {
138141
}
139142
}
140143

141-
funcisInChannel(channels []*storage.Channel,server,channelstring)bool {
142-
ifchannel!="" {
144+
funchasTab(channels []*storage.Channel,openDMs []storage.Tab,server,namestring)bool {
145+
ifname!="" {
143146
for_,ch:=rangechannels {
144-
ifserver==ch.Server&&channel==ch.Name {
147+
ifserver==ch.Server&&name==ch.Name {
148+
returntrue
149+
}
150+
}
151+
152+
for_,tab:=rangeopenDMs {
153+
ifserver==tab.Server&&name==tab.Name {
145154
returntrue
146155
}
147156
}
148157
}
149158
returnfalse
150159
}
151160

152-
funcgetTabFromPath(rawPathstring) (string,string) {
153-
path:=strings.Split(strings.Trim(rawPath,"/"),"/")
154-
iflen(path)>=2 {
155-
name,err:=url.PathUnescape(path[len(path)-1])
156-
iferr==nil&&isChannel(name) {
157-
returnpath[len(path)-2],name
161+
functabFromRequest(r*http.Request) (Tab,error) {
162+
tab:=Tab{}
163+
164+
varpathstring
165+
ifstrings.HasPrefix(r.URL.Path,"/ws") {
166+
path=r.URL.EscapedPath()[3:]
167+
}else {
168+
referer,err:=url.Parse(r.Referer())
169+
iferr!=nil {
170+
returntab,err
158171
}
172+
173+
path=referer.EscapedPath()
159174
}
160-
return"",""
161-
}
162175

163-
funcparseTabCookie(r*http.Request,pathstring) (string,string) {
164176
ifpath=="/" {
165177
cookie,err:=r.Cookie("tab")
166-
iferr==nil {
167-
v,err:=url.PathUnescape(cookie.Value)
168-
iferr==nil {
169-
tab:=strings.SplitN(v,";",2)
178+
iferr!=nil {
179+
returntab,err
180+
}
181+
182+
v,err:=url.PathUnescape(cookie.Value)
183+
iferr!=nil {
184+
returntab,err
185+
}
170186

171-
iflen(tab)==2&&isChannel(tab[1]) {
172-
returntab[0],tab[1]
187+
parts:=strings.SplitN(v,";",2)
188+
iflen(parts)==2 {
189+
tab.Server=parts[0]
190+
tab.Name=parts[1]
191+
}
192+
}else {
193+
parts:=strings.Split(strings.Trim(path,"/"),"/")
194+
iflen(parts)>0&&len(parts)<3 {
195+
iflen(parts)==2 {
196+
name,err:=url.PathUnescape(parts[1])
197+
iferr!=nil {
198+
returntab,err
173199
}
200+
201+
tab.Name=name
174202
}
203+
204+
tab.Server=parts[0]
175205
}
176206
}
177-
return"",""
207+
208+
returntab,nil
178209
}

0 commit comments

Comments
 (0)

[8]ページ先頭

©2009-2025 Movatter.jp